为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

繁星淼淼 2019-12-06 15:58:37

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



查看完整描述

3 回答

?
qq_花开花谢_0

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


查看完整回答
反对 2019-12-06
?
交互式爱情

我认为Vim文档应该已经解释了这些命令命名的含义。仅仅告诉您他们所做的事情并不能帮助您记住名字。


map是所有递归映射命令的“根”。根格式适用于“普通”,“可视+选择”和“操作员待定”模式。(我在语言学中使用“根”一词。)


noremap是所有非递归映射命令的“根”。根格式适用于与相同的模式map。(认为nore前缀表示“非递归”。)


(请注意,还有一些!类似的模式map!适用于插入和命令行。)


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


在模式字母前添加类似n修改映射工作的模式的模式字母。它可以选择适用模式列表的子集(例如,仅“可视”),或选择其他map不适用于的模式(例如,“插入”)。


使用help map-modes将显示一些表格,这些表格解释如何控制映射应用于哪些模式。


模式字母:


n:仅正常

v:视觉并选择

o:待处理运算符

x:仅视觉

s:仅选择

i: 插入

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。K不管是否G以递归方式映射,此映射都不会影响按,因为第2行导致K停止扩展,因此不会使用第3行。


查看完整回答
反对 2019-12-06
?
繁花如伊

一个区别是:


:map 是否nvo==正常+(可视+选择)+运算符待处理

:map!是否ic ==插入+命令行模式

如help map-modes表中所述。


因此:map并非映射到所有模式。


要映射到所有模式,您需要:map和:map!。


查看完整回答
反对 2019-12-06
  • 3 回答
  • 0 关注
  • 217 浏览
慕课专栏
更多

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信