linux · vim · 2015-02-08 · yuex

在 terminal 环境下使用 Vim 时,Meta 键(亦即 Alt)一般是不起作用的 1。但是随着插件越用越多,绑定的组合键越来越多,按键难免会出现越来越不够用的情况。若是可以使用 Meta 键进行键位组合,至少会增加 26 个组合键。这里给出一个通过配置 Vim 来启用 Meta 组合键的方法。

还是直接上代码。这里启用了从 <M-a><M-z> 的 26 组合键和从 <M-0><M-9> 的 10 个组合键。

for i in range(char2nr('a'), char2nr('z'))
    let i = nr2char(i)
    exec "set <M-".i.">=\<Esc>".i
    exec "inoremap \<Esc>".i." <M-".i.">"
endfor

for i in range(char2nr('0'), char2nr('9'))
    let i = nr2char(i)
    exec "set <M-".i.">=\<Esc>".i
    exec "inoremap \<Esc>".i." <M-".i.">"
endfor

在上面这段代码中,我们将诸如 <M-h> 这样的值设置为 <Esc>h,然后用 <M-h> 进行键位绑定,这样 Vim 在某些 terminal 中就可以把 <Esc>h 的按键序列正确地对应到 <M-h> 表示的按键操作上了。为了便 <M-h> 的组合键在 insert 模式中也能使用,我们在上面的代码中加入了 innoremap 一句。之后,我们就可以用 <M-h> 来进行键位映射了,例如以下组合键就可以正常打印信息了。

nnoremap <unique> <M-h> :echo '<\M-h>'<CR>

实际上,这句映射相当于

nnoremap <unique> <Esc>h :echo '<\M-h>'<CR>

只不过 <Esc>h 是针对某一类特殊 terminal 才管用的 dirty hack。用 <M-h> 进行配置,代码的可读性更好一些,换到其它 terminal 下的移植性也更好一些。

以上。


  1. :h map-alt-keys 详细解释了为什么 meta 键不起作用,并给出了一个设置 shell 的方法来解决这个问题。