使用 :map
命令家族你可以定义属于你自己的快捷键。该家族的每一个命令都限定在特定的模式下。从技术上来说 VIM 自带高达 12 中模式,其中 6 种可以被映射。另外一些命令作用于多种模式:
递归 | 非递归 | 模式 |
---|---|---|
:map |
:noremap |
normal, visual, operator-pending |
:nmap |
:nnoremap |
normal |
:xmap |
:xnoremap |
visual |
:cmap |
:cnoremap |
command-line |
:omap |
:onoremap |
operator-pending |
:imap |
:inoremap |
insert |
例如:这个自定义的快捷键只在普通模式下工作。
:nmap <space> :echo "foo"<cr>
使用 :nunmap
可以取消这个映射。对于更少数,不常见的模式(或者他们的组合),查看 :h map-modes
。到现在为止还好,对新手而言有一个问题会困扰他们::nmap
是递归执行 的!结果是,右边执行可能的映射。你自定义了一个简单的映射去输出“Foo”:
:nmap b :echo "Foo"<cr>
但是如果你想要映射 b
(回退一个单词)的默认功能到一个键上呢?
:nmap a b
如果你敲击a,我们期望着光标回退到上一个单词,但是实际情况是“Foo”被输出到命令行里!因为在右边,b
已经被映射到别的行为上了,换句话说就是 :echo "Foo"
。解决此问题的正确方法是使用一种 非递归 的映射代替:
:nnoremap a b
经验法则:除递归映射是必须的,否则总是使用非递归映射。通过不给一个右值来检查你的映射。比如:nmap
显示所以普通模式下的映射,:nmap
显示所有以 键开头的普通模式下的映射。如果你想禁止用标准映射,把他们映射到特殊字符
上,例如::noremap
。相关帮助:
:h key-notation
:h mapping
:h 05.3