Vimscript编程指南

前导字符

============

我们已经学会了如何建立按键映射来让我们用起来比较爽,但是你也许会发现另外的一个问题。

每次我们使用类似于:nnoremap <space> dd命令来对空格键进行映射时,我们就会覆盖空格键原有的功能,但是如果我们后面需要使用空格键原来的功能怎么办呢?

还有很多按键在vim里我们是很少使用的。例如‘\’没有任何功能,-,H,L和空格键基本上都不会使用到。具体其他的不使用的键你自己可以根据自己的使用习惯来发掘。

这些不使用的键可以随意哪来映射,但是只有5个。但是vim神奇的自定义功能可以帮我们实现更多。

映射按键序列

============

不像Emacs,vim可以很简单的映射多个按键,运行下面的命令:

:nnoremap -d dd :nnoremap -c ddO

然后在normal模式下尝试输入‘-d’和‘-c’(速度要快)。这个命令的第一行是自定义了一个删除一行文本的功能,第二行定义了清除一行,并转换到插入模式的功能。

这样也就意味着我们可以用一个不使用的按键,例如‘-’,来用作前导字符,然后再根据这个前导字符来建立相应的映射。这也就意味着我们需要多按一个键来触发映射,不过这个对于手指而言是很容易掌握的。

如果你认为这是个不错的注意的话,那就对了,vim确实也有前导字符的功能。

2、前导字符

============

vim称前缀按键为“leader”。你可以任意设置你的leader键,运行下面的命令:

:let mapleader = "-"

你可以用任意键代替‘-’,我个人比较喜欢用‘,’ ,虽然它是一个很常用的标点,但是它很容易被按下,所以我比较喜欢用逗号。

当你用来定义键盘映射的时候,你可以不管lead键被设置成什么,vim会自动帮你映射的。运行下面命令:

:noremap <leader>d dd

现在试着按leader键加上d,vim会删除当前的文本行。

为什么要用呢?为什么不直接把前导按键放在映射命令里呢?

首先,你可能在后面的某些时候需要用你的前导按键原来的功能。把它定义在同一个地方方便后面修改。

其次,当别人在参考你的~/.vimrc文件的时候,他们马上就会知道键的意思,那么他们需要的话就可以直接拷贝你的映射到他的~/.vimrc文件里,而不需要修改对应的leader键。

最后,有些vim插件会根据你的leader键来做映射的,所以如果你设置了leader键的话,就可以直接用这些映射了。

本地leader键

============

vim有另外一个leader键叫做本地leader键,本地的意思是这个前导键所对应的映射只会对某些类型的文件例如Python文件或者HTML文件有用。

我们后面会讨论怎么对特定的文件类型设定本地映射,不过在这里你可以先试着设置本地映射:

:let maplocalleader="\\"

注意我们需要用‘\’而非‘\’,因为‘\’在字符串里是转义符。在后面会讲到这个的。

现在你可以在映射里像用leader键一样使用localleader键,它们只是映射的按键不同而已。

练习

============

  • 阅读:help mapleader
  • 阅读:help maplocalleader
  • 在你的~/.vimrc文件里设置mapleader 和maplocalleader键
  • 把你的~/.vimrc里的所有快捷键都改成带leader键的映射,以免覆盖之前本来的功能。