前导按键

我们已经学习了一种可以避免以后抓狂的映射按键的方法,但是你也许会发现另外一个问题。

每次我们用类似 :nnoremap <space> dd 的命令,都会把 <space> 的原有功能给覆盖了。 要是以后需要用这个按键怎么办?

在日常使用 Vim 中,有一大堆按键是不太会用到的。 -HL<space><cr> 、以及 <bs> 就是几乎用不到的(当然,是在普通模式下)。 根据使用习惯,你还可以找到一些其他完全用不到的按键。

这些都可以放心地用来映射,但是仅仅是这六个按键而已。 Vim 传说般的自定义能力会给我们带来什么呢?

映射按键序列

不像 Emacs 一样,Vim 可以轻松地映射多个按键。运行命令:

:nnoremap -d dd
:nnoremap -c ddO

试试在普通模式下键入 -d-c (快速地)。 第一条命令创建了一个自定义映射来删除一行,而第二条而是“清除”了一行并且进入插入模式。

这就意味着可以选择一个无需在意的按键(比如 - )来当做“前缀”,然后在它基础上创建映射。 也就是说,需要键入一个额外的按键来激活映射,但一次额外的按键可以轻易的被肌肉记忆所记住。

如果认为这也许是个不错的主意,那就对了,并且事实是 Vim 已经有了这种“前缀”按键的机制!

前导按键

Vim 称这个“前缀”按键为“前导按键”(原文:leader)。可以设置任何喜欢的按键为前导按键。 运行命令:

:let mapleader = "-"

可以用任何按键来替换 - 。笔者个人喜欢用 , ,因为它很容易键入,尽管这会使一个有用的功能变的模糊。 (译者注:, 原本的功能是反方向重复最近一次的 ftFT ,如果把 , 设为前导按键后,并不会使这个功能无效,而只是变慢。因为它在等后续输入,但发现没有了后续输入之后,它便运行原本的功能。)

当创建新的映射时,可以用 <leader> 来表示“任何设置成为了前导按键的按键”。 运行命令:

:nnoremap <leader>d dd

现在试试按下前导按键和 d 。Vim 会删除当前行。

不过为什么要先麻烦的设置 <leader> ?为什么不直接把“前缀”按键放在映射命令里? 这有三个原因:

首先,你可以决定在以后某个时候使用前导按键原来的功能。 把它定义在一个地方方便以后可以轻松地更改。

其次,当别人看你的 ~/.vimrc 文件时,可以马上知道 <leader> 是什么意思。 如果他们喜欢你的映射,即便是使用了不同的前导按键,也只需要简单地把它们复制到自己的 ~/.vimrc 文件中,

最后,很多 Vim 插件创建了以 <leader> 开头的映射。 如果已经设置过了,那么它们就会正常工作,并且一开始就感觉很熟悉。

本地前导按键

Vim 有第二类“前导按键”,称为“本地前导按键”。 这意味着,映射的前缀只会在某些类型的文件中生效,比如 Python 和 HTML 文件。

我们会在后面的章节在讲到如何给特定类型的文件创建映射,但现在,开始设置“本地前导按键”吧:

:let maplocalleader = "\\"

注意,我们必须使用 \\ ,而并不只是 \ ,因为 \ 在 Vimscript 的字符串中是转义字符。 在以后会学习到更多的关于转义字符的内容。

现在,可以在映射中使用 <localleader> ,它就会像 <leader> 一样工作 (当然,除了需要键入一个不同的按键以外)

如果不喜欢反斜杠,尽管改成其他按键好了。

练习

阅读 :help mapleader

阅读 :help maplocalleader

~/.vimrc 文件中设置 mapleadermaplocalleader

把在前面章节中添加到 ~/.vimrc 文件中的映射全部转换成以 <leader> 为前缀,使它们不会覆盖已经存在的命令。

原文地址:http://learnvimscriptthehardway.stevelosh.com/chapters/06.html