map,noremap,abbrev和noreabbrev命令之间有什么区别?


19

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


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

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

Answers:


21

首先,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将用k替换j并将k无限次替换k,因此将向您显示创建了递归映射的错误。

这就是为什么通常建议您几乎总是(除非有<Plug>映射或类似内容时)使用非递归映射。这样可以防止在无意中创建递归映射时Vim挂起。因此,非递归映射是在Vim中映射命令的一种更安全的方法。

通过上面的信息,我们可以看到这:noreabbrev只是:abbrev命令的非递归版本。

:abbrev只能在插入,替换和命令模式下使用。:abbrev用于创建缩写,(Vim可以扩展的快捷方式)。简短的说明是使用:map/ :noremap创建映射,:abbrev/ :noreabbrev创建缩写,或者在任何时候您希望Vim扩展您的输入内容时。


1
避免挂起并不是使用noremap命令形式的唯一原因。使用它们的另一个(也是我认为更重要的)原因是它们使您的映射可靠/可预测。如果您使用纯格式,并且rhs包含一个碰巧被映射到其他对象的键,那么您的映射行为可能与预期的行为完全不同。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.