Monday, February 17, 2014

[Emacs] Mac OS Terminal中设置Emacs热键

由于工作条件的一些限制,我不能在MacOS中之间使用单独的Emacs App而必须要在Terminal里运行Emacs.所以我花时间设置了一下我的Emacs,使的它在Terminal中也可以像在App里一样完美运行.

最大的障碍来自于Terminal里对于热键的设置


在Terminal里设置按键(单独的按键以及组合按键)所激发的xterm key code. 下面这张图是我的设置:
主要是关于方向键加上ctrl/shift/alt的组合.

关于xterm key Code:

Terminal将按键事件转换成一个xterm key code并发送给当前窗口中运行的shell. 比如Shift加上方向键up被记录成一个code "\033[1;2A". 这里"\033"其实对应的是Esc键.
关于更多的xterm key code的简介可以从这里获得:


更加完整的的关于xterm code的reference:
总而言之, 你需要把你需要用到的组合按键设置在Terminal中, 使得Emacs可以收到

剩下的就是对于Emacs里热键的设置


Emacs的key mapping系统无比的复杂. 我使用了一种笨办法: 把每一个我关心的热键组合的xterm key code都在input-decode-map里定义成对应的组合键. 比如下面的设置. 这里"\e"相当于"\033"
(define-key input-decode-map "\e[9A" [(meta up)])
(define-key input-decode-map "\e[9B" [(meta down)])
(define-key input-decode-map "\e[9C" [(meta right)])
(define-key input-decode-map "\e[9D" [(meta left)])
(define-key input-decode-map "\e[2A" [(shift up)])
(define-key input-decode-map "\e[2B" [(shift down)])
(define-key input-decode-map "\e[2C" [(shift right)])
(define-key input-decode-map "\e[2D" [(shift left)])
(define-key input-decode-map "\e[10A" [(shift meta up)])
(define-key input-decode-map "\e[10B" [(shift meta down)])
(define-key input-decode-map "\e[10C" [(shift meta right)])
(define-key input-decode-map "\e[10D" [(shift meta left)])

这样Emacs才能在key stream里识别出来传进来的meta/shift/ctrl等热键. 然后再使用Emacs里的global-set-key来绑定组合到特定的function上, 比如我设置meta加up为backward-paragraph:
(global-set-key [(meta up)] 'backward-paragraph)
(global-set-key [(meta down)] 'forward-paragraph)
(global-set-key [(meta left)] 'backward-word)
(global-set-key [(meta right)] 'forward-word)

No comments: