remap
是一个选项,它使映射以递归方式工作。默认情况下它是打开的,我建议你保持这种状态。其余的是映射命令,如下所述:
:map
和 :noremap
是各种映射命令的递归和非递归版本。例如,如果我们运行:
:map j gg (moves cursor to first line)
:map Q j (moves cursor to first line)
:noremap W j (moves cursor down one line)
然后:
j 将映射到 gg。
Q 也将被映射到 gg,因为 j 将被扩展为递归映射。
将映射到 j(而不是 gg),因为 j 不会为非递归映射扩展。
现在记住 Vim 是一个模态编辑器。它有普通模式、视觉模式和其他模式。
对于这些映射组中的每一个,都有一个在正常、可视、选择和运算符模式(:map
和 :noremap
)下工作的 mapping,在正常模式下工作的一个 :nmap
和 :nnoremap
,一个处于可视模式(:vmap
和 :vnoremap
)等等。
有关这方面的更多指导,请参阅:
:help :map
:help :noremap
:help recursive_mapping
:help :map-modes
我认为 Vim 文档应该已经解释了这些命令命名背后的含义。只是告诉你他们做了什么并不能帮助你记住这些名字。
map
是所有递归映射命令的“根”。根形式适用于“正常”、“视觉+选择”和“操作员挂起”模式。 (我在 linguistics 中使用术语“根”。)
noremap
是所有非递归映射命令的“根”。根形式适用于与 map
相同的模式。 (想想 nore
前缀表示“非递归”。)
(请注意,还有适用于插入和命令行的 map!
等 !
模式。)
有关“递归”在此上下文中的含义,请参见下文。
附加一个模式字母(如 n
)修改映射工作的模式。它可以选择适用模式列表的子集(例如,仅“视觉”),或选择 map
不适用的其他模式(例如“插入”)。
使用 help map-modes
将向您展示一些表格,说明如何控制映射适用于哪些模式。
模式字母:
n:仅正常
v:视觉和选择
o:运营商待定
x:仅视觉
s:仅选择
我:插入
c:命令行
l:插入、命令行、正则表达式搜索(和其他。统称为“Lang-Arg”伪模式)
“递归”是指将映射展开为一个结果,然后将该结果展开为另一个结果,以此类推。
当其中一项为真时,扩展停止:
结果不再映射到其他任何东西。已应用非递归映射(即“noremap”[或其同类之一] 是最终扩展)。
此时,Vim 对最终结果的默认“含义”被应用/执行。
“非递归”意味着映射仅扩展一次,并且该结果被应用/执行。
例子:
nmap K H
nnoremap H G
nnoremap G gg
以上导致 K
扩展为 H
,然后 H
扩展为 G
并停止。它停止是因为 nnoremap
,它立即扩展并停止。 G
的含义将被执行(即“跳到最后一行”)。在扩展链中最多会应用一个非递归映射(这将是最后一次发生的扩展)。
G
到 gg
的映射仅在您按 G
时适用,但在您按 K
时不适用。无论 G
是否被递归映射,此映射都不会影响按 K
,因为是第 2 行导致 K
的扩展停止,因此不会使用第 3 行。
map
仅适用于正常、视觉、选择和操作员挂起模式,而不适用于所有模式。
一个区别是:
:map 没有 nvo == 正常 + (visual + select) + operator 挂起
:地图! ic == 插入 + 命令行模式
如 help map-modes
表所述。
因此:map
并未映射到所有模式。
要映射到所有模式,您需要 :map
和 :map!
。
command mode
是 normal mode
的另一个历史名称,即。第 5 章vimdoc.sourceforge.net/htmldoc/intro.html#vim-modes-intro)。 缩写 'c' 代表 'command-line'。 换句话说,默认情况下:map! lhs rhs
递归地 将 lhs 映射到 rhs 用于 insert + command- LINE 模式。除非在 ~/.vimrc 中使用 set noremap[!]
明确禁用 remap
默认选项。在这种情况下,映射将不是递归的(不建议)。
我将简单地解释映射命令。
首先,我们有两个通用的映射命令:
map - 在正常、可视、选择和操作符挂起模式下递归工作。
地图! - 在插入和命令行模式下递归工作。
这些命令的非递归变体是:
noremap - 在正常、可视、选择和操作员挂起模式下以非递归方式工作。
地图! - 在插入和命令行模式下以非递归方式工作。
然后,我们有特定于模式的命令:
nmap - 在正常模式下递归工作。
imap - 在插入模式下递归工作。
vmap - 在视觉和选择模式下递归工作。
xmap - 在可视模式下递归工作。
smap - 在选择模式下递归工作。
cmap - 在命令行模式下递归工作。
omap - 在运算符挂起模式下递归工作。
以及它们的非递归变体:
nnoremap - 在正常模式下以非递归方式工作。
inoremap - 在插入模式下以非递归方式工作。
vnoremap - 在视觉和选择模式下以非递归方式工作。
xnoremap - 在可视模式下以非递归方式工作。
snoremap - 在选择模式下以非递归方式工作。
cnoremap - 在命令行模式下以非递归方式工作。
onoremap - 在运算符挂起模式下以非递归方式工作。
最后,remap
是一个布尔选项,它允许映射以递归方式工作。值得一提的是,您 should 始终将此选项保留为默认值 on
。
no[remap] {lhs} {rhs}
,这意味着将键序列{lhs}
映射到{rhs}
,但不要重新映射{rhs}
中的任何命令,以避免嵌套和递归映射。
noremap
和 noremap!
的部分之后。我想知道和 Janac Meena 完全一样的事情。 (我想我可能有能力进行编辑,但我不想在别人的答案中添加新内容。)
不定期副业成功案例分享
noremap
与map
是相反的。我的意思是删除映射的东西。感谢你的回答。它澄清了我:map
等不能在 all 模式下工作,确切地说,只是所有常见的模式(特别是,正常模式、可视模式、选择模式和操作员挂起模式)。如果您希望映射在插入、命令行或 lang-arg 模式下工作,则需要使用:map!
等。(来源:vimdoc.sourceforge.net/htmldoc/map.html#map-overview)