本地缓冲选项和映射

现在我们要花上几分钟来回顾已经讲过的三个概念:映射、缩写、选项,但是存在一个变数。 我们会在单个缓冲中依次设置它们中的每一个。

这个想法真正的强大之处会在下一章节显现出来,但是现在我们需要打好基础。

在这一章节中,你需要在 Vim 中打开两个文件,每个在自己分割窗口中。 我把他们命名为 foobar,但是你可以取任何喜欢的名字。 然后在每个里面输入一些文本。

映射

切换到 foo 文件,并运行以下命令:

:nnoremap          <leader>d dd
:nnoremap <buffer> <leader>x dd

现在停留在 foo 文件中,确保是在普通模式,并键入 <leader>d。 Vim 会删除一行。这并不是什么新知识。

仍然停留在 foo 文件中,键入 <leader>x。Vim 会再次删除一行。 这是可以理解的,因为我们把 <leader>x 也映射为了 dd

现在移动到 bar 文件中。在普通模式中,键入 <leader>d。 再次,Vim 删除了当前行。这里也没有什么出人意料的。

现在变数要出现了:当仍然在 bar 文件中时,键入 <leader>x

Vim 仅仅删除了单个字符,而不是删除整行!发生了什么?

第二个 nnoremap 命令中的 <buffer> 告诉 Vim 只考虑在缓冲中定义过的映射。

当你在 bar 文件中键入 <leader>x,Vim 找不到匹配的映射,所以把它当做两个命令: <leader>(本身是不会做任何事情的)和 x(通常会删除单个字符)。

本地前导按键

在前面的例子中,我们用了 <leader>x 来作为本地缓冲映射,但这是个糟糕的方式。 通常,当你创建一个只适用于特定缓冲的映射时,应该用 <localleader> 而不是 <leader>

使用两个不同的前导按键提供了一种类似“命名空间”的概念,这会帮助你记住各种各样的映射而不至于弄混。

当你写插件给其他人用的时候,这点愈发重要。 在本地映射中使用 <localleader> 的约定会避免你的插件覆盖其他人的 <leader> 映射, 而这些映射早已随时间辛辛苦苦地烙印进手指中。

设置

在本书最早的一个章节中,我们讲到过用 set 设置选项。 有些选项总是运用在 Vim 的所有情况下,但是另外一些会设置在缓冲的基础上。

切换到 foo 文件,并运行以下命令:

:setlocal wrap

现在切换到 bar 文件,并运行命令:

:setlocal nowrap

把 Vim 窗口调小,你就会看到 foo 中的文本换行了,但 bar 中的没有。

让我们试试另一个选项。切换到 foo,并运行命令:

:setlocal number

现在切换到 bar,并运行命令:

:setlocal nonumber

你会发现 foo 中有行号,而 bar 中没有。

并不是所有的选项都可以用 setlocal。想看看是否能本地设置某个选项,那就阅读它相关的 :help

到目前为止,我已经掩盖了一些关于本地选项实际上是如何工作的细节。 在练习中,你会了解到更多骇人听闻的细节。

遮蔽

在继续之前,让我们看看本地映射的一个特别的、有趣的特性。 切换到 foo,并运行以下命令:

:nnoremap <buffer> Q x
:nnoremap          Q dd

现在键入 Q。发生了什么?

当你按下 Q,Vim 会运行第一个映射,而不是第二个,因为第一个映射比第二个更明确

切换到 bar,并键入 Q,可以看到 Vim 用了第二个映射,因为在这个缓冲中它没有被第一个所遮蔽。

练习

阅读 :help local-options

阅读 :help setlocal

阅读 :help map-local

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