最大的障碍来自于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:
Post a Comment