!
变体。目前,我对它们的使用非常随意,所以我能知道与它们相关的陷阱是什么吗?特别是有关各种模式版本的说明可能会有用,因为我从Peter Rincker的评论中获悉,cmap
可以在行中的任何地方扩展很多,而不仅是在使用:
命令时。我可以采取哪些预防措施来防止潜在的陷阱?#1 楼
首先,map
和noremap
的相似之处在于,它们分别为正常,可视,选择和操作员待定模式创建映射。 Vim在:help map-overview
中对此进行了详细说明:Overview of which map command works in which mode. More details below.
COMMANDS MODES ~
:map :noremap :unmap Normal, Visual, Select, Operator-pending
:nmap :nnoremap :nunmap Normal
:vmap :vnoremap :vunmap Visual and Select
:smap :snoremap :sunmap Select
:xmap :xnoremap :xunmap Visual
:omap :onoremap :ounmap Operator-pending
:map! :noremap! :unmap! Insert and Command-line
:imap :inoremap :iunmap Insert
:lmap :lnoremap :lunmap Insert, Command-line, Lang-Arg
:cmap :cnoremap :cunmap Command-line
根据上述帮助,如果您想将映射限制为特定的模式,则必须先添加:
'n'(对于普通),'v'(对于可视和选择),'c'(对于命令),'x'(对于可视模式),'s'(对于选择),'o' (用于待处理的运营商)。例如,
nmap n nzz
将创建
n
的普通模式,递归映射。<现在,
noremap
只是map
的非递归版本。那么什么是非递归映射? Vim也可以通过
:help map-recursive
来解决这个问题:If you include the {lhs} in the {rhs} you have a recursive mapping. When
{lhs} is typed, it will be replaced with {rhs}. When the {lhs} which is
included in {rhs} is encountered it will be replaced with {rhs}, and so on.
This makes it possible to repeat a command an infinite number of times. The
only problem is that the only way to stop this is by causing an error. The
macros to solve a maze uses this, look there for an example. There is one
exception: If the {rhs} starts with {lhs}, the first character is not mapped
again (this is Vi compatible).
For example: >
:map ab abcd
will execute the "a" command and insert "bcd" in the text. The "ab" in the
{rhs} will not be mapped again.
这样的例子是映射以下内容:
:imap j k
:imap k j
现在,vim会将j替换为k且k无限次替换j,因此将向您显示创建了递归映射的错误。
这就是为什么通常建议您几乎总是(除非有
<Plug>
映射或类似映射时)使用非递归映射。这样可以防止在无意中创建递归映射时Vim挂起。因此,非递归映射是在Vim中映射命令的一种更安全的方法。通过上面的信息,我们可以看到
:noreabbrev
只是:abbrev
命令的非递归版本。 /> 只能在插入,替换和命令模式下使用
:abbrev
。 :abbrev
用于创建缩写,(Vim可以扩展的快捷方式)。简短的扩展是使用:map
/ :noremap
创建映射,使用:abbrev
/ :noreabbrev
创建缩写,或者在任何时候您想让Vim扩展输入内容时。评论
避免挂起并不是使用map命令的nore形式的唯一原因。使用它们的另一个(也是我认为更重要的)原因是它们使您的映射可靠/可预测。如果您使用普通形式,并且rhs包含恰好被映射到其他对象的键,则您的映射行为可能与预期的行为完全不同。
–丰富
17年2月13日在9:45
map和remap有什么区别?
–马格努斯
20年7月5日在16:42
评论
下一部分是一个meta:在此站点上回答时,我们应使用哪种形式? -我应该在Meta上提问还是将其添加到问题中?我会说这取决于。如果演示映射,我将始终使用noremap版本。这样,人们养成了在递归版本上使用非递归映射的习惯。除非当然没有理由,例如在