1.1 vim 递归映射和非递归映射
递归映射和非递归映射是 Vim 中两种不同的键盘映射方式。
递归映射(recursive map)是指在定义键盘映射时,映射的右侧的命令会触发其他映射。例如,假设你已经有一个映射 map j dd
,它将 j
键映射为删除一行的命令。然后你又定义了一个新的映射 map k j
,它将 k
键映射为 j
命令。当你按下 k
键时,由于使用的是递归映射,j
命令会触发 j
到 dd
的映射,所以结果是删除一行。
非递归映射(non-recursive map)是指在定义键盘映射时,映射的右侧的命令不会触发其他映射。还是以上面的例子为例,如果你使用的是非递归映射,例如 nnoremap k j
,那么当你按下 k
键时,j
命令不会触发其他映射,所以结果是将光标向下移动一行,而不是删除一行。
在大多数情况下,使用非递归映射是更好的选择,因为它可以避免可能的循环和混淆。在 Vim 中,你可以使用 map
和 noremap
来定义递归映射和非递归映射,例如 nmap
和 nnoremap
分别用于在普通模式下定义递归映射和非递归映射。
1.1.1 vim 可视模式
Vim 的可视模式是 Vim 的三种主要模式之一,另外两种是普通模式和插入模式。在可视模式下,你可以选择文本块并对其执行操作,类似于其他文本编辑器中的选择并操作的工作方式。
你可以通过以下方式进入可视模式:
-
v:字符可视模式。在普通模式下按 v 将进入字符可视模式,在这个模式下,你可以通过移动光标来选择文本。
-
V:行可视模式。在普通模式下按 V 将进入行可视模式,在这个模式下,你可以通过上下移动光标来选择整行文本。
-
:块可视模式。在普通模式下按 将进入块可视模式,在这个模式下,你可以通过移动光标来选择一个文本块。
在可视模式下选择文本后,你可以执行各种命令,比如复制 (y)、粘贴 (p
)、删除 (d) 或者修改 (c
)。
例如,你可以进入行可视模式 (V
), 选择几行文本,然后按 d 来删除这些行,或者按 y 来复制这些行。
因此,Vim 的可视模式提供了一种直观的方式来选择和操作文本。
1.2 map nmap vnormap nnoremap inoremap 区别
Vim 使用了一种强大的键盘映射系统,可以让你自定义或修改键盘命令。以下部分将详细解释和示例 vmap, nmap, map, nnoremap, inoremap。
-
vmap:在可视模式下创建键盘映射。例如,
vmap <F2> y
在可视模式下将 F2 键映射为复制命令。 -
nmap:在普通模式下创建键盘映射。例如,
nmap <F2> :w<CR>
在普通模式下将 F2 键映射为保存文件的命令。 -
map:在普通、可视和操作符等待模式下创建键盘映射。例如,
map <F2> :w<CR>
在这些模式下将 F2 键映射为保存文件的命令。 -
nnoremap:在普通模式下创建非递归键盘映射。非递归映射意味着映射的右侧的命令不会再触发其他映射,从而避免了可能的循环。例如,
nnoremap j gj
将j
键映射为gj
命令,即使gj
也被映射到其他命令,j
键仍然只会执行gj
命令。 -
inoremap:在插入模式下创建非递归键盘映射。例如,
inoremap jj <Esc>
将jj
映射为Esc
命令,这意味着你可以通过输入jj
来退出插入模式,而不需要按Esc
键。
这些命令都可以在 vimrc 文件中设置,或者在 Vim 的命令模式下输入以立即生效。记住,为了避免映射冲突或无法预料的结果,最好在创建新的键盘映射之前,先使用 unmap 命令来取消任何现有的映射。