这些命令以某种方式将一组击键转换为另一组击键,但是我对哪种击键最适合某些情况感到有些困惑。此外,还有它们的!变体。目前,我对它们的使用非常随意,所以我能知道与它们相关的陷阱是什么吗?特别是有关各种模式版本的说明可能会有用,因为我从Peter Rincker的评论中获悉,cmap可以在行中的任何地方扩展很多,而不仅是在使用:命令时。我可以采取哪些预防措施来防止潜在的陷阱?

评论

下一部分是一个meta:在此站点上回答时,我们应使用哪种形式? -我应该在Meta上提问还是将其添加到问题中?

我会说这取决于。如果演示映射,我将始终使用noremap版本。这样,人们养成了在递归版本上使用非递归映射的习惯。除非当然没有理由,例如在映射中专门使用map。

#1 楼

首先,mapnoremap的相似之处在于,它们分别为正常,可视,选择和操作员待定模式创建映射。 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