Vim 的按键映射在 GUI 情况下的支持是相当完备的, 例如
,
, 但是如果 vim 处于 terminal
中, 那么就需要做额外一些处理
terminal 中的 vim 接受的按键是经过 terminal 处理的, 换句话说, 如果在 terminal 中就不能正确接受到一个按键组合, 那么 运行在 terminal 上的
vim 是不可能获得正确事件并作出相应动作的
keycode
我们做映射的关键就是理解 keycode
在 terminal 到 vim 的传递及转化
-
terminal key code
:^[[1;2A
,^[
表示ESC
-
vim key code
:,
, Vim 的 keycode 具有字面含义, 因为他要运行在不同的系统上
查看方式
-
terminal
: 使用cat
或sed -n l
等支持管道的命令, 然后直接按下按键组合即可显示 -
vim
: 在命令模式下使用
可显示当前按键组合在 vim 中所产生的字符序列key
vim 支持的 keycode
key code
termcap
总的来说, vim 支持
-
~ -
~ -
, -
, -
~ -
~ -
~
-...
默认情况下, 以下的 keycode
是没有使用的, 我们可以映射为以下按键
-
~ -
~ -
~ -
~ -
~
set vim internal keycode
首先我们在终端中将我们需要的按键的 terminal keycode
获得, 然后在 vim 中使用 set
来绑定 vim keycode
, 最后使用 map 对该
vim keycode
进行映射
-
:set
:=^[[1;2B ^[
表示ESC
, 将终端产生的term keycode
绑定为 vim 的 -
:set
: 错误! 因为 vim 不支持这样的=^[[1;6B keycode
-
:map
: 使用这种方式可以避免上个的错误, 这样是将[1;6B term keycode
转换为了vim keystroke
-
execute "nmap \ed-r
: 使用"
序列进行映射, 将d-r term keycode
转换为了vim keystroke
-
nmap
: 直接用D-r>
字符串进行映射, 将term keycode
转换为了vim keystroke
-
:set
: 使用字面意义进行绑定,={C-v}{Esc}[1;2B {}
表示真实的按键所产生的结果 -
:set
: 同上={C-v}{S-Down}
当我们在
term keycode
->vim keycode
这一步不允许时, 可以转变思路为term keycode
->vim keystroke
当我们写脚本时, 不能使用set
, 需要使用=^[[1;6B execute "set
=\e[1;6B"
一些错误写法示范
-
:set
,=^[[1;2B :map
: 多余,
默认已经被vim keycode
支持了, 不需要使用
,
直接:set
=^[[1;2B -
:map
: 不正确,{C-v}{BS}
可以使用
代替, 不需要再使用没必要的映射
ASCII 标准键盘字符码表
link
如何从 MacVim 中映射 command 与 option
默认下, MacVim 支持设置
的 map 使用 ⌘
键与其他按键的组合, 设置 set macmeta
后可以用
来表示 ⌥
键与其他按键的组合
因为有一些 ⌘
组合键已经被 MacVim 预定义了, 我们可以使用 macmenu &File.Print key=
的方式移除快捷键, 然后定义自己的动作
如何从 iterm 中映射 command 与 option
本文讲的就是如何让 terminal 中发射的字符被 vim 正确利用. 在理解了以上文章的基础上,
我们可以使用任何终端进行自定义, 针对于 iterm2
, 我们可以这样
当然, iTerm2 还支持一个选项: Send Test with "vim" Special Chars
, 这个选项用来法
系列的按键还是可以的, 但是对于
按键来说则不生效, 如果要使用, 我们还是需要将 term keycode
转为 vim keystroke
这样使用
的话就和直接 Send Text
没什么区别了
未知问题
-
set
会报错=...
参考
- Mapping fast keycodes in terminal Vim
- Using the ⌘Command Key For Vim Shortcuts