天天看点

Vim中的remap,noremap,nnoremap和vnoremap映射命令有什么区别?

Vim中的remap,noremap,nnoremap和vnoremap映射命令有什么区别?

#1楼

我认为Vim文档应该解释这些命令命名背后的含义。 告诉你他们做了什么并不能帮助你记住这些名字。

map

是所有递归映射命令的“根”。 根表单适用于“正常”,“视觉+选择”和“操作员待定”模式。 (我在语言学中使用术语“root”。)

noremap

是所有非递归映射命令的“根”。 根表单适用于与

map

相同的模式。 (把

nore

前缀想象成“非递归”。)

(注意,还有像

map!

这样的

!

模式适用于插入和命令行。)

请参阅下文,了解“递归”在此上下文中的含义。

预先设置类似

n

的模式字母,修改映射所适用的模式。它可以选择适用模式列表的子集(例如,仅“视觉”),或选择

map

不适用的其他模式(例如“插入”) 。

使用

help map-modes

将显示一些表,说明如何控制映射适用的模式。

模式字母:

  • n

    :仅正常
  • v

    :视觉和选择
  • o

    :运营商待定
  • x

    :仅视觉
  • s

    :仅选择
  • i

    :插入
  • c

    :命令行
  • l

    :insert,命令行,regexp-search(以及其他。集体称为“Lang-Arg”伪模式)

“ 递归 ”表示将映射扩展为结果,然后将结果扩展为另一个结果,依此类推。

当其中一个成立时,扩展停止:

  1. 结果不再映射到其他任何内容。
  2. 已经应用了非递归映射(即“noremap”[或其中一个]是最终扩展)。

此时,应用/执行Vim对最终结果的默认“含义”。

“ 非递归 ”表示映射仅展开一次,并且应用/执行该结果。

例:

nmap K H
 nnoremap H G
 nnoremap G gg
           

以上原因使

K

扩展为

H

,然后

H

扩展为

G

并停止。 它因

nnoremap

而停止,

nnoremap

会立即扩展和停止。 将执行

G

的含义(即“跳到最后一行”)。 最多只有一个非递归映射将应用于扩展链(这将是最后一次扩展)。

G

gg

的映射仅适用于按

G

,但如果按

K

则不适用。 无论

G

是否以递归方式映射,此映射都不会影响按

K

,因为它的第2行会导致

K

的扩展停止,因此不会使用第3行。

#2楼

一个区别是:

  • :map

    确定

    nvo

    == normal +(visual + select)+ operator pending
  • :map!

    ic

    == insert +命令行模式

help map-modes

表所述。

所以:

map

不会映射到所有模式 。

要映射到所有模式,您需要

:map

:map!

#3楼

remap

是一个使映射以递归方式工作的选项 。 默认情况下它已打开,我建议你保持这种状态。 其余的是映射命令 ,如下所述:

:map

:noremap

是各种映射命令的递归和非递归版本。 这意味着,如果你这样做:

:map j gg
:map Q j
:noremap W j
           

j

将映射到

gg

Q

也将映射到

gg

,因为

j

将被扩展用于递归映射。

W

将被映射到

j

(而不是

gg

),因为

j

不会针对非递归映射进行扩展。

现在请记住,Vim是一个模态编辑器 。 它具有普通模式, 可视模式和其他模式。

对于这些映射集中的每一个,都有一个映射可以在正常,可视,选择和操作员模式下工作(

:map

:noremap

),一个在普通模式下工作(

:nmap

:nnoremap

),一个在可视模式下(

:vmap

:vnoremap

)等等。

有关此问题的更多指导,请参阅:

:help :map
:help :noremap
:help recursive_mapping
:help :map-modes
           

#4楼

注意,

vnoremap

vmap

在Visual AND Select模式下工作。 要仅在可视模式下进行映射,请使用

xmap

xnoremap