这些命令以某种方式将一组击键转换为另一组击键,但是我对哪种击键最适合某些情况感到有些困惑。此外,还有它们的!
变体。目前,我对它们的使用非常随意,所以我能知道与它们相关的陷阱是什么吗?特别是有关各种模式版本的注释可能会很有用,因为我从Peter Rincker那里学到了一条注释,该注释cmap
可以扩展到行中的几乎所有位置,不仅是在使用:
命令时。我可以采取哪些预防措施来预防潜在的陷阱?
这些命令以某种方式将一组击键转换为另一组击键,但是我对哪种击键最适合某些情况感到有些困惑。此外,还有它们的!
变体。目前,我对它们的使用非常随意,所以我能知道与它们相关的陷阱是什么吗?特别是有关各种模式版本的注释可能会很有用,因为我从Peter Rincker那里学到了一条注释,该注释cmap
可以扩展到行中的几乎所有位置,不仅是在使用:
命令时。我可以采取哪些预防措施来预防潜在的陷阱?
Answers:
首先,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将用k替换j并将k无限次替换k,因此将向您显示创建了递归映射的错误。
这就是为什么通常建议您几乎总是(除非有<Plug>
映射或类似内容时)使用非递归映射。这样可以防止在无意中创建递归映射时Vim挂起。因此,非递归映射是在Vim中映射命令的一种更安全的方法。
通过上面的信息,我们可以看到这:noreabbrev
只是:abbrev
命令的非递归版本。
您:abbrev
只能在插入,替换和命令模式下使用。:abbrev
用于创建缩写,(Vim可以扩展的快捷方式)。简短的说明是使用:map
/ :noremap
创建映射,:abbrev
/ :noreabbrev
创建缩写,或者在任何时候您希望Vim扩展您的输入内容时。
nore
map命令形式的唯一原因。使用它们的另一个(也是我认为更重要的)原因是它们使您的映射可靠/可预测。如果您使用纯格式,并且rhs
包含一个碰巧被映射到其他对象的键,那么您的映射行为可能与预期的行为完全不同。