×

vi 命令手册

vi/vim 命令大全

vim 命令手册

Vim 关于Vim 安装Vim 用法Vim 配置vim 配置.vimrc方案vim 配置.vimrc方案1vim 配置.vimrc方案2Vim 文件合并Vim 技巧和建议Vim 插件Vim 参阅

Vimscript 编程参考

Vimscript 前言Vimscript 鸣谢Vimscript 预备知识Vimscript 打印信息Vimscript 设置选项Vimscript 基本映射Vimscript 模式映射Vimscript 精确映射Vimscript LeadersVimscript 编辑你的Vimrc文件Vimscript AbbreviationsVimscript 更多的MappingsVimscript 锻炼你的手指本地缓冲区的设置和映射Vimscript 自动命令Vimscript 本地缓冲区缩写Vimscript 自动命令组Operator-Pending 映射Operator-Pending 更多映射Vimscript 状态条Vimscript 负责任的编码Vimscript 变量Vimscript 变量作用域Vimscript 条件语句Vimscript 比较Vimscript 函数Vimscript 函数参数Vimscript 数字Vimscript 字符串Vimscript 字符串函数Vimscript Execute命令Vimscript Normal命令Vimscript 执行normal!Vimscript 基本的正则表达式Grep 运算符Operator 第1部分Grep 运算符Operator 第2部分Grep 运算符Operator 第3部分Vimscript 列表Vimscript 循环Vimscript 字典Vimscript 切换Vimscript 函数式编程Vimscript 路径Vimscript 创建一个完整的插件Vimscript 基本插件配置方式用Pathogen配置插件Vimscript 检测文件类型Vimscript 基本语法高亮Vimscript 高级语法高亮Vimscript 基本折叠Vimscript 高级折叠Vimscript 段移动原理Vimscript Potion段移动Vimscript 外部命令Vimscript 自动加载Vimscript 文档Vimscript 发布Vimscript 还剩下什么?

Vimscript 精确映射


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

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

:nmap - dd
:nmap  -

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

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

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

:nunmap -
:nunmap 

递归

运行命令:

:nmap dd Ojddk

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

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

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

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

这个映射实际上是 递归 的!当你按下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


分类导航

关注微信下载离线手册

bootwiki移动版 bootwiki
(群号:472910771)