統計一下,原來我用了 emacs 已有半個世紀,但我仍然覺得自己其實不太會用。有人曾說用 emacs 的頭五年會很痛苦,第六年起會轉好,由此可見其 learning curve 之可怕之處。我已用了五年,仍然覺得不舒服。
認識的人當中,不太多人用 emacs 。我認識的人之中,有以下人士是用 emacs 的: R usergroup 的 Guy Freeman 、 Python usergroup 的 Jimmy Wong 和大學 CS department 的某位很有趣的教授。之後已想不到第四個人了。
開始覺得要再精進一點。 ((其中一個原因是要在工作間教人用 emacs ,教學相長。)) 既然 emacs 是 most customizable editor ,就應該學下 customization 。其實之前也有 customize ,但 .emacs 檔也不算太長。
未有時間學 emacs lisp ,就先玩 emacs keyboard macro 。
工作上有些東西是常常 repeat 的。例如先 eval 一段 Python 的 code ,再將畫面分半﹐再將其中一半變成 Inferior Python 。 ((某些 python mode 有這個功能,但跟機的沒有。)) 若然是按鍵的話,即是

1. C-c C-r (eval)
2. C-x 2 (切半)
3. C-x o (轉去另一半)
4. C-x b (轉 Buffer)
5. *Python* (指明轉去 Inferior Python)

為了令這組按鍵更 robust ,應該要在 C-x 2 之前加入 C-x 1 ,確保現在沒有切半,才進行切半。
在 emacs ,可以按 C-x ( 來始定義 macro ,再按 C-x ) 終止。之後要為這個 macro 定義名稱,按 C-x C-k n 。
有名稱的 macro 可轉為 emacs lisp (M-x insert-kbd-macro),儲存在 .emacs 裡。
只要在 .emacs 將儲存的 macro 定義 keybinding ,就可以快速使用。
最終,在 .emacs 會多了這幾句。


(fset 'pythonevalbuffersplit
(lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ("^Xh^C^R^X1^X2^Xo^Xb*Python*^M" 0 "%d")) arg)))

(fset 'pythonevalregionsplit
(lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ("^C^R^X1^X2^Xo^Xb*Python*^M" 0 "%d")) arg)))

(global-set-key "\C-x\C-kb" 'pythonevalbuffersplit)
(global-set-key "\C-x\C-kr" 'pythonevalregionsplit)