站内链接:

术语和命令

键映射用于改变输入键的含义, 最常见的用途是把功能键定义为一系列的命令, 其相关文档: help map-commands.

  • 正常格式: map [arguments] {lhs} {rhs}, 将某些{lhs}映射为{rhs}.
  • 删除映射格式: unmap [arguments] {lhs}
  • 清除映射格式: mapclear [arguments]

其中{rhs}之前存在一些特殊字符表示特定的信息:

1
2
3
.             " 表示不可重映射
& " 表示脚本的局部映射可以被重映射
@ " 表示缓冲区的局部映射

关于命令参数的更多信息见help map-arguments文档说明, 下面简单的介绍一些常见的参数信息以及相应的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<buffer>      " 映射仅仅作用于当前缓冲区(此时正在编辑的文件), 之后可以在另一个缓冲区设置同样键值, 不同效果的map

" a. 表示映射,w为在当前缓冲区进行字符a的查找
map <buffer> ,w /a<cr>
umap <buffer> ,w

<nowait> " 不考虑二义性
<silent> " 执行的时候不在命令行上回显命令(安静), 这个命令也经常使用
" b. 安静查找
map <silent> ,w /abcd<cr>

<special> " 用于定义某些特殊键有副作用的场合
" c. 映射F12
map <special> <F12> /Header<cr>

<unique> " 定义命令的同时进行键检查,判断键值是否已经存在
<Leader> " 其中<Leader>的值有mapleader来确定,默认为'\', 经常使用

<expr> " 参数作为表达式来进行计算,即最后为计算后的值插入顺序的列表编号,之后返回
" e. 表达式计算, 插入模式下映射, 避免嵌套映射
inoremap <expr> . InsertDot()

命令格式

在介绍 vim 的映射命令之前可以先看下vim 模式以更好的了解 vim 的集中输入模式, 同时映射也包含在不同模式下的映射, 下面是常见的在 map 命令之前的几种前缀:

1
2
3
4
5
6
7
8
9
<space>           " 在普通, 可视, 选择, 操作符等待模式下生效
n " 在普通模式下生效: nmap
v " 在可视/选择模式下生效: vmap
i " 在插入模式下生效: imap
c " 在命令行模式下生效: cmap
l " 在插入/命令行/Lang-Arg模式下生效: lmap
s " 在选择模式下生效: smap
x " 在可视模式下: xmap
o " 在操作符等待模式下生效: omap

在不同的 map 命令前面可能还存在一些修饰符用以表示不同的动作:

1
2
3
4
5
6
7
8
9
nore              " 禁止对{rhs}进行映射扫描, 从而避免嵌套和递归, 即lhs定义的就是rhs的键
un " 删除映射,其中可以更随上面的各种前缀

" 1. 例如, 此时ts就是映射为td, 而非前面的映射
map td :tabnew .<cr>
noremap ts td

# 2. 取消映射
unmap td

最后, 除了上面的几个前缀修饰符之外还有一个 clear 后缀命令mapclear, 其会清除相关模式下的所有映射

1
2
mapclear         " 清除普通模式下的所有映射
vmapclear " 清除可视模式下的所有映射

Rule

递归映射

递归映射: a 映射为 b,c 映射为 a,则 c 映射为 b

1
2
3
" 两个命令等价于:map c b
map a b
map c

二义性

相关文档可以参考help map-ambiguous, 当两个映射以相同的字符顺序开始,它们是有二义性的, 例如:

1
2
:imap aa foo
:imap aaa bar

当 Vim 读入aa 后,它需要取得另外一个字符才能决定应该映射 aa 还是 aaa, 这意味着输入 aa 后映射还不会展开,Vim 还在等待另一个字符.如果你接着输入一个空格,那么将插入 foo 加上空格.如果你输入一个 a,那么将插入 bar.

特殊键值

在 map 命令中会映射很多特殊键值, 从而提高编辑效率, 这是非常通用的方式, 下面简单介绍一些常见的键值

1
2
3
4
5
6
7
8
9
10
<f1>-<f12>               " F1-f12
<k0>-<k9> " 0-9
<S-> " Shirt + 键
<C-> " Control + 键
<A-> " Alt + 键
<Esc> " Esc键
<Space> " 空格键
<tab> " tab键
<cr> " Enter键
<M-> " Alt + 键 或者 meta + 键