JSRUN 用代码说话

精确映射

编辑教程

精确映射

准备好,下面的内容会比较难以理解。

目前为止,我们已经使用map、nmap、vmap以及imap创建了实用的按键映射。 他们很方便,但是有个缺点。运行下面的命令:

:nmap - dd
:nmap \ -

试试按下\(在normal模式)。有什么现象?

当你按下\时,Vim会解释其为-。但是我们又映射了-!Vim会继续解析-为dd, 即它会删除整行。

你使用那些命令创建的映射可能会被Vim解释成 其它 的映射。乍一听这像是一个优点, 但实际上这很变态。解释原因之前,我们先用如下命令删除那些映射:

:nunmap -
:nunmap \

递归

运行命令:

:nmap dd O<esc>jddk

上面的命令看上去像是要映射dd为:

在当前行之前添加新行
退出insert模式
向下移动一行
删除当前行
向上移动到新加的行

貌似这个映射的作用是“清除当前行”。但你可以试试。

当你按下dd后,Vim就不动了。按下<c-c>才可以继续,但是你的文件中会多出许多 空行!想想发生了什么?

这个映射实际上是 递归 的!当你按下dd后,Vim解释为:

dd存在映射,执行映射的内容。
新建一行。
退出insert模式。
向下移动一行。
dd存在映射,执行映射的内容。
新建一行。
退出insert模式。
向下移动一行。
dd存在映射,执行映射的内容。然后一直这样。

这个映射永远不会结束!删除这个可怕的映射再继续:

:nunmap dd

负面影响

*map系列命令的一个缺点就是存在递归的危险。另外一个是如果你安装一个插件,插件 映射了同一个按键为不同的行为,两者冲突,有一个映射就无效了。

当安装一个新的插件时,可能你不会使用或记住每一个其创建的映射。即使你记住了,你还得 回看下你的~/.vimrc文件以确保你自定义的映射与插件创建的没有冲突。

这导致插件安装变得乏味,易于出错。肯定有个解决办法。

非递归映射

Vim提供另一组映射命令,这些命令创建的映射在运行时 不会 进行递归。运行命令:

:nmap x dd
:nnoremap \ x

按下\看看有什么现象。

当你按下\时,Vim忽略了x的映射,仅按照x的默认操作执行。即删除当前光标下的字符 而不是删除整行。

每一个map系列的命令都有个对应的noremap命令,包括:noremap/nnoremap、 vnoremap和inoremap。这些命令将不递归解释映射的内容。

该何时使用这些非递归的映射命令呢?

答案是: 任何时候 。

是的,没开玩笑, 任何时候 。

在安装插件或添加新的自定义映射时使用*map系列命令纯属是给自己 找 麻烦。 多敲几个字符以确保这个问题不会发生,救自己于火海。

JSRUN闪电教程系统是国内最先开创的教程维护系统, 所有工程师都可以参与共同维护的闪电教程,让知识的积累变得统一完整、自成体系。 大家可以一起参与进共编,让零散的知识点帮助更多的人。
X
支付宝
9.99
无法付款,请点击这里
金额: 0
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间
如有疑问请联系QQ:565830900
正在生成二维码, 此过程可能需要15秒钟