准备好,下面的内容会比较难以理解。
目前为止,我们已经使用map
、nmap
、vmap
以及imap
创建了实用的按键映射。 他们很方便,但是有个缺点。运行下面的命令:
:nmap - dd
:nmap -
试试按下(在normal模式)。有什么现象?
当你按下时,Vim会解释其为
-
。但是我们又映射了-
!Vim会继续解析-
为dd
, 即它会删除整行。
你使用那些命令创建的映射可能会被Vim解释成 其它 的映射。乍一听这像是一个优点, 但实际上这很变态。解释原因之前,我们先用如下命令删除那些映射:
:nunmap -
:nunmap
运行命令:
:nmap dd O<esc>jddk
上面的命令看上去像是要映射dd
为:
貌似这个映射的作用是“清除当前行”。但你可以试试。
当你按下dd
后,Vim就不动了。按下<c-c>
才可以继续,但是你的文件中会多出许多 空行!想想发生了什么?
这个映射实际上是 递归 的!当你按下dd
后,Vim解释为:
dd
存在映射,执行映射的内容。
dd
存在映射,执行映射的内容。
dd
存在映射,执行映射的内容。然后一直这样。这个映射永远不会结束!删除这个可怕的映射再继续:
:nunmap dd
*map
系列命令的一个缺点就是存在递归的危险。另外一个是如果你安装一个插件,插件 映射了同一个按键为不同的行为,两者冲突,有一个映射就无效了。
当安装一个新的插件时,可能你不会使用或记住每一个其创建的映射。即使你记住了,你还得 回看下你的~/.vimrc
文件以确保你自定义的映射与插件创建的没有冲突。
这导致插件安装变得乏味,易于出错。肯定有个解决办法。
Vim提供另一组映射命令,这些命令创建的映射在运行时 不会 进行递归。运行命令:
:nmap x dd
:nnoremap x
按下看看有什么现象。
当你按下时,Vim忽略了
x
的映射,仅按照x
的默认操作执行。即删除当前光标下的字符 而不是删除整行。
每一个*map
系列的命令都有个对应的*noremap
命令,包括:noremap
/nnoremap
、 vnoremap
和inoremap
。这些命令将不递归解释映射的内容。
该何时使用这些非递归的映射命令呢?
答案是: 任何时候 。
是的,没开玩笑, 任何时候 。
在安装插件或添加新的自定义映射时使用*map
系列命令纯属是给自己 找 麻烦。 多敲几个字符以确保这个问题不会发生,救自己于火海。
将之前章节中添加到~/.vimrc
文件中的映射命令全部换成非递归版本。
读帮助文档:help unmap
。
SVG rect 本节介绍 SVG 形状元素中的 ——rect 元素,该元素会在屏幕上绘制一个矩形 。SVG Shapes SVG有一些预定义的形状元素,...
XML Schema all 元素 完整 XML Schema 参考手册定义和用法元素规定子元素能够以任意顺序出现,每个子元素可出现零次或一次。元素...
XQuery FLWOR + HTML 本节为你介绍XQuery FLWOR 表达式加 HTML 的使用。XML 实例文档 我们将在下面的例子中继续使用这个 "books....
XML DOM cloneNode() 方法 Element 对象定义和用法 cloneNode() 方法创建指定节点的精确拷贝。 该方法返回克隆的节点。 语法clon...
animationend 事件 事件对象实例在 CSS 动画结束后为 div 元素添加监听事件:var x = document.getElementById(myDIV);//Chrome, ...
HTML input disabled 属性HTML input 标签实例带有已禁用的输入字段的 HTML 表单:form action=demo-form.phpFirst name: input ...
HTML legend align 属性HTML legend 标签实例对标题进行右对齐:formfieldsetlegend align=right个人信息:/legend姓名: input ty...