Emacs & Tmux 折騰筆記

GUI 版的 Emacs 好看是好看,但啟動時間比在終端機裡遲緩、GTK3 也比較吃資源。而且 KDE 的工具列總是得多一個 Emacs 佔空間,加上自己算是中重度的終端機使用者,操作時希望能不離開終端機不碰滑鼠是最好。所以我自己是用終端機版的 Emacs (啟動方式為emacs -nw) 搭配 tmux 使用。但還有不少問題要折騰,以下有一些建議設定可以參考:

256 Colors

最不重要的先講(不過至少對我來說這個設定很重要):讓 Tmux 裡的 Emacs 能夠有 256-color output。一當然是因為好看,二是某些功能、例如寫 CSS 必備的 rainbow-mode 需要至少 256 色才能用。

TERM 指定成 xterm-256color。以 Konsole 為例:Edit Current Profile > General > Environment > Edit 後,改成下面這行:

1
TERM=xterm-256color

~/.tmux.conf也需要做好對應設定(~/ 裡沒有這個檔案請自行新增),加上:

1
set -g default-terminal "screen-256color"

沒意外的化應該已經可以在 Tmux + Emacs 裡顯示 256 色了,可以 M-x list-colors-display 測試一下。

不過在 256color 下,有很多有名的 theme 像是 Solarized 那種 low-contrast 的配色是很難看的(因為很多該顯示的顏色在 256color 下只能顯示近似值,結果有些顏色實際顯示出來根本就一樣…)。如果煩惱不知 256 色下有什麼 theme 能用的話,可以參考一下不才在下做的 moe-theme ,專為 256 色終端機設計 XD。

只有 256-color 一樣可以使用 rainbow-mode ,雖然顏色不準確,但在程式碼中還是會變得非常好辨認,起碼不會讓你覺得那堆色碼是 magic number。

Alias

修改~/.zshrc~/.bashrc,加上兩個 alias:

1
2
alias emacs='emacs -nw'
alias ta='if tmux attach-session -t 0;then;else tmux;fi'

第一行作用是以後只要輸入 emacs 就能開啟 CLI(文字界面)版本的 Emacs。

第二行的作用是「一開終端機只要輸入 ta 就能開 tmux,而且當已經有 session 存在的話直接 attach 進去」,會這樣做是因為如果只是平常使用,通常應該不會在 Tmux 裡開到一個以上的 session(至少我從沒有這種需要…),而且每次 detach 掉還要打一長串 tmux attach-session -t [number] 掛回來很麻煩。

Tmux Key-binding

(如果您已經自訂過 tmux,可以跳過這一段)
編輯~/.tmux.conf,不存在請自行建立。

1
2
3
unbind C-b
set -g prefix M-C-b
bind-key k confirm-before -p "kill-window #W? (y/n)" kill-window

因為 Tmux 預設的 prefix (C-b)會跟 Emacs 相衝,最後找來找去發現大概只有 M-C-b 這個 binding 比較沒有相衝問題,而且在其他主機上用 Tmux 也不會太難以習慣。

然後 kill-window 我改成 prefix + k,比較符合 Emacs 在 kill buffer (C-x k) 時的使用習慣。

Emacs Key-binding

編輯.emacs,加入

1
2
3
4
5
6
7
8
9
;;解決 tmux 下無法切換 buffer 以及一些 key-binding 的問題
(global-set-key (kbd "C-x M-[ d") 'previous-buffer)
(global-set-key (kbd "C-x M-[ c") 'next-buffer)
(global-set-key (kbd "M-[ c") 'forward-word)
(global-set-key (kbd "M-[ d") 'backward-word)
(global-set-key (kbd "C-c M-[ d") 'backward-sexp)
(global-set-key (kbd "C-c M-[ c") 'forward-sexp)
(global-set-key (kbd "C-c M-[ a") 'backward-up-list)
(global-set-key (kbd "C-c M-[ b") 'down-list)

如此問題會少一點(苦笑)

Clipboard

去 Emacs Wiki 下載 xclip-mode,丟到~/.emacs.d/lisps/裡後,~/.emacs 加上:

1
2
3
4
5
6
7
8
9
;; xclip-mode
(load "~/.emacs.d/lisps/xclip-1.0.el")
(define-minor-mode xclip-mode
"Minor mode to use the `xclip' program to copy&paste."
:global t
(if xclip-mode
(turn-on-xclip)
(turn-off-xclip)))
(xclip-mode t)

可以解決 X11 與 Emacs 剪貼簿共用的問題。

不過貼上的速度變得有點遲緩,如果不用C-y而用滑鼠中間鍵貼上的話會超級遲緩。這我也不知該怎麼辦。如您知道解法請不吝賜教。

失效的 Key-binding

換到文字界面的 Emacs 後,會發現有部份原本可以使用的 key-binding 突然變得不能用了,尤其是最複雜的 Org-mode(例如 Shift+[Arrow]Ctrl+[0-9]),因為這些按鍵終端機是抓不到的。

Org-mode

Org-mode 在設計時有考慮到這問題,所以有作了一些在終端機裡也能用的替代按鍵,可以參考 TTY-Keys

Super Key

Super 鍵(就是常說的Win鍵)是在 X11 裡定義的,除非經過一些特殊設定,不然 tty 或 terminal 都無法辨識這個鍵,我自己是沒去折騰這個,因為太麻煩。如果你堅持要用,詳情可以查一下 StackOverflow,有人問過。

其他

遇到其他之前在 GUI 版可以使用、但終端機抓不到的 key-binding 時,基本上你有幾種選擇:

  1. 開 GUI 版,C-h k 查詢你平常按的那個 key-binding 是綁到哪個 function,再自己自訂一個 CLI 版下能用的 key-binding。
  2. C-h f 直接查那個 function 是否本來就還有其他按法。
  3. 土法煉鋼 M-x

Undo/Redo

這一定要特別提出來講:改用 CLI 版的 Emacs 我最無法接受的就是 undo-tree 的 redo 竟然沒辦法按 C-? ,因為 terminal 抓不到 Ctrl-Shift- 開頭的按鍵。雖然 undo-tree 提供的幾個替代按法中M-_是可用的,但 undo 按 C-/ 、redo 按 M-_ 實在有點讓人精神錯亂…

其實也是可以自己改成其他 key-binding,但這種很常用的東西我是盡量不改,最重要的原因是

  1. 在不得已的情況下,沒有慣用的~/.emacs 也不會感到有太大不便。
  2. Un*x 界很多地方都是可以用 Emacs-style 的 key-binding 的,例如 Bash/Zsh, less,習慣標準的 key-binding 有利無弊。(Emacs 使用者操作 Bash/Zsh 基本上跟操作 Emacs 的感覺幾乎一樣,例如我發現最扯的是竟然可以在 Bash/Zsh 裡用 kill-ring…)

所以我最後想辦法習慣了 undo 按 C-_,redo 按 M-_ 這種機車的 key-binding…(一位 Vim 使用者誠摯地表示:「怎麼這麼麻煩」)

認命吧~當你決定學 Emacs 的那天開始,就別指望你面臨的是條正常典型又合理的學習曲線 XD

Source: http://mrozekma.com/editor-learning-curve.png

改用 CLI 版的 Emacs 搭配 tmux 是有好處,但說實話真的很麻煩。不過如果你是終端機重度使用者,或者有連工作站的需求,還是得折騰一下 XD

要不…就是盡早跳到 Vim…