Vimscript编程指南

高级映射

=======

到现在为止,我们已经学了不少关于映射的知识了,我们现在来讨论一下该怎么使用它们。映射功能可以大大提高我们进行文本编辑的效率,所以多花点时间来讨论一下是很值得的。

一个我们已经在前面的例子里介绍的概念是多字符映射,下面我们来看看这个功能。 运行下面的命令: :nnoremap jk dd

现在先进入normal模式,然后快速输入jk,vim将会删除当前行。

现在只输入j,并暂停一小会。如果你不是在输入j后立马输入k的话,vim就认为你不想使用映射,所以就只运行了j的基本功能(往下移动一行)。

不过这个映射会让我们在文本里移动的时候显得比较麻烦,所以要用下面的命令删除它: :nunmap jk

现在你再次输入jk时会上下移动光标。

一个更加复杂的映射

=======

现在我们已经讨论了很多不同的映射了,是时候让我们一起看看一些比较复杂的映射了。运行下面的命令: :nnoremap <leader>" viw<esc>a"<esc>hbi"<esc>lel

这个映射比较复杂!首先,让我们先试试它。进入normal模式,把光标放在文本里的一个单词上,然后输入leader键和引号。Vim会在这个单词的两边加上引号!

这个是怎么起作用的呢?让我们把上面的命令拆开来分析一下:

viw<esc>"a<esc>hbi"<esc>lel

  • vim 在visual模式下选中当前单词
  • esc 退出visual模式,使光标停留在单词的最后一个字符上
  • a 进入插入模式,让光标移动到当前字符的后面
  • " 我们现在在insert模式下,所以会输入引号
  • 进入到normal模式
  • h 向左移动一个字符
  • b 移动到当前单词的开头
  • i 进入到insert模式,并且光标在当前字符前面
  • " 在文本里插入引号
  • 返回到normal模式
  • i 向左移动一个字符,并且光标停留在单词的首字母上
  • e 移动到单词的结尾处
  • l 向右移动一个字符,使得光标停留在第二个引号后面

注意:因为我们用的是nnoremap而不是nmap,所以不管我们使用了什么字符来进行映射,vim都会使用该字符的最基本的功能。

现在你应该看到了vim映射的潜在的强大了吧,不过你也应该知道它的可读性是多么的差。

练习

=======

  • 创建一个和上面差不多的映射,不过用单引号代替双引号
  • 用vnoremap来建立这样一个映射:它可以折叠你在visual模式下选择的任意在引号里的文本。你可能需要使用gv命令,所以先阅读一下:help gv。
    • 把H映射为把光标移动到当前行的开始处,因为h的功能是向左移动一个字符,你可以考虑H为h功能的加强版
    • 把L映射为把光标移动到当前行的结尾处,因为l的功能是向右移动一个字符,你可以考虑L是l功能的加强版
  • 用:help H和help:L来查看你刚刚覆盖的两个功能,看看你是否需要它们(很有可能你不需要)
  • 把上面的映射添加到你的vimrc文件里,并确保你使用的是“edit ~/.vimrc”和“source ~/.vimrc”映射。