您的位置:58编程 > vim 映射 Vimscript 精确映射

vim 映射 Vimscript 精确映射

2023-05-21 18:33 Vim教程

vim 映射 Vimscript 精确映射

vim 映射 Vimscript 精确映射

vim 映射

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

目前为止,我们已经使用mapnmapvmap以及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、 vnoremapinoremap。这些命令将不递归解释映射的内容。

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

答案是: 任何时候 。

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

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

练习

将之前章节中添加到~/.vimrc文件中的映射命令全部换成非递归版本。

读帮助文档:help unmap

阅读全文
以上是58编程为你收集整理的vim 映射 Vimscript 精确映射全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
  • Svg矩形嵌套自动变大 SVG 矩形

    Svg矩形嵌套自动变大 SVG 矩形

    SVG rect 本节介绍 SVG 形状元素中的 ——rect 元素,该元素会在屏幕上绘制一个矩形 。SVG Shapes SVG有一些预定义的形状元素,...

  • xml 元素 XML Schema all 元素

    xml 元素 XML Schema all 元素

    XML Schema all 元素 完整 XML Schema 参考手册定义和用法元素规定子元素能够以任意顺序出现,每个子元素可出现零次或一次。元素...

  •  XQuery FLWOR + HTML

    XQuery FLWOR + HTML

    XQuery FLWOR + HTML 本节为你介绍XQuery FLWOR 表达式加 HTML 的使用。XML 实例文档 我们将在下面的例子中继续使用这个 "books....

  • xml dom XML DOM cloneNode() 方法

    xml dom XML DOM cloneNode() 方法

    XML DOM cloneNode() 方法 Element 对象定义和用法 cloneNode() 方法创建指定节点的精确拷贝。 该方法返回克隆的节点。 语法clon...

  • 查看xml文件工具 查看 XML 文件

    查看xml文件工具 查看 XML 文件

    查看 XML 文件XML 文件中包含了许多的元素,XML 格式的信息和其他标记的基本单元,以及各种各样的数据。本节教你如何对 XML 文件...

  •  XML DTD

    XML DTD

    XML 验证 DTD 为英文Document Type Definition,中文意思为“文档类型定义”。拥有正确语法的 XML 被称为"形式良好"的 XML。通过...

  •  animationend 事件

    animationend 事件

    animationend 事件 事件对象实例在 CSS 动画结束后为 div 元素添加监听事件:var x = document.getElementById(myDIV);//Chrome, ...

  •  HTTP 教程

    HTTP 教程

    HTTP 教程HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件...

  • html input disabled HTML input disabled 属性

    html input disabled HTML input disabled 属性

    HTML input disabled 属性HTML input 标签实例带有已禁用的输入字段的 HTML 表单:form action=demo-form.phpFirst name: input ...

  • html中legend属性 HTML legend align 属性

    html中legend属性 HTML legend align 属性

    HTML legend align 属性HTML legend 标签实例对标题进行右对齐:formfieldsetlegend align=right个人信息:/legend姓名: input ty...

© 2024 58编程 58biancheng.com 版权所有 联系我们
桂ICP备12005667号-32 Powered by CMS