Vim中的remap,noremap,nnoremap和vnoremap映射命令有什么区别?
答案 0 :(得分:1449)
remap
是一个选项,可以使映射以递归方式工作。默认情况下它已打开,我建议你保持这种状态。其余的是映射命令,如下所述:
:map
和:noremap
是各种映射命令的递归和非递归版本。这意味着如果你这样做:
:map j gg
:map Q j
:noremap W j
j
将映射到gg
。 {em}也将 映射到Q
,因为gg
将针对递归映射进行扩展。 j
将映射到W
(而不是j
),因为gg
不会针对非递归映射进行扩展。
现在请记住,Vim是一个模态编辑器。它具有正常模式,视觉模式和其他模式。
有关每个这些映射存在的,有一个mapping,在正常的,视觉的,选择和操作员模式的工作原理(j
和:map
),一个在正常模式下工作(:noremap
和:nmap
),一个处于可视模式(:nnoremap
和:vmap
),依此类推。
有关此方面的更多指导,请参阅:
:vnoremap
答案 1 :(得分:235)
我认为Vim文档应该解释这些命令命名背后的含义。告诉你他们做了什么并没有帮助你记住这些名字。
map
是所有递归映射命令的“根”。根表单适用于“正常”,“视觉+选择”和“操作员待定”模式。 (我在linguistics中使用术语“root”。)
noremap
是所有非递归映射命令的“根”。根表单适用于与map
相同的模式。 (将nore
前缀视为“非递归”。)
(请注意,!
模式也适用于map!
,适用于插入和命令行。)
请参阅下文,了解“递归”在此上下文中的含义。
预先设置类似n
的模式字母,修改映射的模式。它可以选择适用模式列表的子集(例如,仅“视觉”),或选择map
的其他模式不适用于(例如“插入”)。
使用help map-modes
将显示一些表格,说明如何控制映射适用的模式。
模式字母:
n
:仅正常v
:视觉效果并选择o
:operator-pending x
:仅限视觉s
:仅选择i
:插入c
:命令行l
:insert,命令行,regexp-search(和其他人。统称为“Lang-Arg”伪模式)“递归”表示将映射扩展为结果,然后将结果扩展为另一个结果,依此类推。
当其中一个成立时,展开会停止:
此时,应用/执行Vim对最终结果的默认“含义”。
“非递归”表示映射仅展开一次,并且该结果已应用/执行。
示例:
nmap K H
nnoremap H G
nnoremap G gg
以上原因导致K
扩展为H
,然后H
展开为G
并停止。它会因nnoremap
而停止,它会立即展开和停止。 G
的含义将被执行(即“跳到最后一行”)。最多只有一个非递归映射将应用于扩展链(这将是最后一次扩展)。
G
到gg
的映射仅适用于G
,但如果按K
则不会。无论K
是否以递归方式映射,此映射都不会影响按G
,因为第2行导致K
的扩展停止,因此第3行不会使用
答案 2 :(得分:73)
注意,vnoremap
和vmap
在Visual AND Select模式下工作。
要仅在可视模式下进行映射,请使用xmap
和xnoremap
。
答案 3 :(得分:18)
一个区别是:
:map
nvo
==普通+(视觉+选择)+操作员待定:map!
执行ic
== insert + command-line mode 如help map-modes
表所述。
所以: map
不会映射到所有模式。
要映射到所有模式,您需要:map
和:map!
。