vim中的remap,noremap,nnoremap和vnoremap映射命令有什么区别?
注意, vnoremap 和 vmap 在Visual AND Select模式下工作 . 要仅在可视模式下进行映射,请使用 xmap 和 xnoremap .
vnoremap
vmap
xmap
xnoremap
一个区别是:
:map 确实 nvo ==正常(视觉选择)运算符挂起
:map
nvo
:map! 确实 ic ==插入命令行模式
:map!
ic
如 help map-modes 表所述 .
help map-modes
所以: map does not map to all modes .
要映射到所有模式,您需要 :map 和 :map! .
remap 是 option ,它使映射以递归方式工作 . 默认情况下它已打开,我建议您保持这种状态 . 其余的是 mapping commands ,如下所述:
remap
:map 和 :noremap 是各种映射命令的 recursive 和 non-recursive 版本 . 这意味着,如果你这样做:
:noremap
:map j gg :map Q j :noremap W j
j 将映射到 gg . Q 也将映射到 gg ,因为 j 将被扩展用于递归映射 . W 将映射到 j (而不是 gg ),因为 j 将不会针对非递归映射进行扩展 .
j
gg
Q
W
现在记住Vim是 modal editor . 它具有 normal 模式, visual 模式和其他模式 .
对于这些映射集中的每一个,都有一个mapping,它在普通模式,视觉模式,选择模式和操作模式下工作( :map 和 :noremap ),一个在正常模式下工作( :nmap 和 :nnoremap ),一个在可视模式下工作( :vmap 和 :vnoremap )等等 .
:nmap
:nnoremap
:vmap
:vnoremap
有关此问题的更多指导,请参阅:
:help :map :help :noremap :help recursive_mapping :help :map-modes
我认为vim文档应该解释这些命令命名背后的含义 . 告诉你他们做了什么并不能帮助你记住这些名字 .
map 是所有递归映射命令的"root" . 根表单适用于"normal","visual+select"和"operator-pending"模式 . (我在linguistics中使用了"root"这个术语 . )
map
noremap 是所有非递归映射命令的"root" . 根表单适用于与 map 相同的模式 . (将 nore 前缀想象成"non-recursive" . )
noremap
nore
(请注意,还有 ! 模式,如 map! ,适用于插入和命令行 . )
!
map!
请参阅下文,了解“递归”在此上下文中的含义 .
预先添加模式字母(如 n )可修改映射的模式 . 它可以选择适用模式列表的子集(例如,仅"visual"),或选择 map 不适用的其他模式(例如"insert") .
n
使用 help map-modes 将显示一些表,说明如何控制映射适用的模式 .
模式字母:
n :仅正常
v :视觉和选择
v
o :运营商待定
o
x :仅视觉
x
s :仅选择
s
i :插入
i
c :命令行
c
l :insert,命令行,regexp-search(以及其他 . 集体称为"Lang-Arg"伪模式)
l
“ Recursive ”表示将映射扩展为结果,然后将结果扩展为另一个结果,依此类推 .
当其中一个成立时,扩展停止:
结果不再映射到其他任何内容 .
已经应用了非递归映射(即"noremap" [或其中一个]是最终扩展) .
此时,应用/执行vim对最终结果的默认“含义” .
“ Non-recursive ”表示映射仅展开一次,并且应用/执行该结果 .
例:
nmap K H nnoremap H G nnoremap G gg
以上原因导致 K 扩展为 H ,然后 H 扩展为 G 并停止 . 它会因 nnoremap 而停止,它会立即扩展和停止 . 将执行 G 的含义(即"jump to last line") . 最多只有一个非递归映射将应用于扩展链(这将是最后一次扩展) .
K
H
G
nnoremap
G 到 gg 的映射仅适用于按 G ,但如果按 K 则不适用 . 无论 G 是否以递归方式映射,此映射都不会影响按 K ,因为它是第2行导致 K 的扩展停止,因此不会使用第3行 .
4 回答
注意,
vnoremap
和vmap
在Visual AND Select模式下工作 . 要仅在可视模式下进行映射,请使用xmap
和xnoremap
.一个区别是:
:map
确实nvo
==正常(视觉选择)运算符挂起:map!
确实ic
==插入命令行模式如
help map-modes
表所述 .所以: map does not map to all modes .
要映射到所有模式,您需要
:map
和:map!
.remap
是 option ,它使映射以递归方式工作 . 默认情况下它已打开,我建议您保持这种状态 . 其余的是 mapping commands ,如下所述::map
和:noremap
是各种映射命令的 recursive 和 non-recursive 版本 . 这意味着,如果你这样做:j
将映射到gg
.Q
也将映射到gg
,因为j
将被扩展用于递归映射 .W
将映射到j
(而不是gg
),因为j
将不会针对非递归映射进行扩展 .现在记住Vim是 modal editor . 它具有 normal 模式, visual 模式和其他模式 .
对于这些映射集中的每一个,都有一个mapping,它在普通模式,视觉模式,选择模式和操作模式下工作(
:map
和:noremap
),一个在正常模式下工作(:nmap
和:nnoremap
),一个在可视模式下工作(:vmap
和:vnoremap
)等等 .有关此问题的更多指导,请参阅:
我认为vim文档应该解释这些命令命名背后的含义 . 告诉你他们做了什么并不能帮助你记住这些名字 .
map
是所有递归映射命令的"root" . 根表单适用于"normal","visual+select"和"operator-pending"模式 . (我在linguistics中使用了"root"这个术语 . )noremap
是所有非递归映射命令的"root" . 根表单适用于与map
相同的模式 . (将nore
前缀想象成"non-recursive" . )(请注意,还有
!
模式,如map!
,适用于插入和命令行 . )请参阅下文,了解“递归”在此上下文中的含义 .
预先添加模式字母(如
n
)可修改映射的模式 . 它可以选择适用模式列表的子集(例如,仅"visual"),或选择map
不适用的其他模式(例如"insert") .使用
help map-modes
将显示一些表,说明如何控制映射适用的模式 .模式字母:
n
:仅正常v
:视觉和选择o
:运营商待定x
:仅视觉s
:仅选择i
:插入c
:命令行l
:insert,命令行,regexp-search(以及其他 . 集体称为"Lang-Arg"伪模式)“ Recursive ”表示将映射扩展为结果,然后将结果扩展为另一个结果,依此类推 .
当其中一个成立时,扩展停止:
结果不再映射到其他任何内容 .
已经应用了非递归映射(即"noremap" [或其中一个]是最终扩展) .
此时,应用/执行vim对最终结果的默认“含义” .
“ Non-recursive ”表示映射仅展开一次,并且应用/执行该结果 .
例:
以上原因导致
K
扩展为H
,然后H
扩展为G
并停止 . 它会因nnoremap
而停止,它会立即扩展和停止 . 将执行G
的含义(即"jump to last line") . 最多只有一个非递归映射将应用于扩展链(这将是最后一次扩展) .G
到gg
的映射仅适用于按G
,但如果按K
则不适用 . 无论G
是否以递归方式映射,此映射都不会影响按K
,因为它是第2行导致K
的扩展停止,因此不会使用第3行 .