Learning Vimscript The Hard Way — (11) Buffer-Local Options and Mappings/缓冲区局部设置和映射

缓冲区局部设置和映射

现在我们要花几分钟去重温一下我们已经学过的三样东西:映射、缩写和选项,但会混在一起讲(with a twist)。我们要将它们设置到单独的缓冲区里面。

这个点子真正的力量你在下一章就会知道了,但是我们现在需要先在这打好基础(lay the groundwork)。

这一章你需要在 Vim 里面打开两个文件,每个占一个分屏。我会将他们称作 foo bar,但是你可以按你喜欢对他们进行命名。然后往里面写点字。

【译注:

我在 gvim 下面这样创建两个分屏,初始状态是打开的未保存的新建文件:

:w d:\foo.txt! :split e d:\bar.txt!

映射:

切换到 foo 里面运行下面的命令:

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

现在留在 foo 里面,确保你正处于常规模式,然后输入 <leader>d,Vim 会删除一个行,这没什么新鲜的。

还是在 foo 里面,输入 <leader>x。再次,Vim 会删除一个行,这很好理解,因为我们将 <leader>x 也映射到 dd 了。

现在我们转到 bar。在常规模式里面,输入 <leader>d。再次,Vim 删掉了当前的行。到这里也没啥惊喜的发现。

现在来了:我们在 bar 里面,输入 <leader>x。【感觉作者好会卖关子】

这回 Vim 没把整行删掉,而只是删掉了一个字符!到底发生了什么?

我们在第二个 nnoremap 命令里面告诉 Vim 的这个 <buffer>,意思是我们定义的这个映射,只在定义它的时候所在的缓冲区里面生效。

当你在 bar 里面输入 <leader>x 的时候,Vim 找不到匹配的映射,所以【这个输入】就被当做两个命令来处理了:一个 <leader>(它本身不起任何作用),和 x(默认地删除一个字符。)

局部 Leader

在我们的例子里面,我们用 <leader>x 作为缓冲区局部映射,但这种形式不太好,当你要创建一个映射只在特定的缓冲区里面生效的时候,你应该使用 <localleader> 而不是 <leader>

用两个分来的 leader 键可以提供一种“命名空间”来让将各种不同的映射直接记在脑海中。

当你要写一个插件给别人用的时候,这就更加重要了。在局部映射中使用 <localleader> 的方便性在于,这不会另你的插件覆盖掉其他人【指的是用你插件的那货】的 <leader>,以及那堆煞费苦心(painstakingly)炼成的那套映射。

设置

在早前的章节里面我们讲过用 set 来设置选项。有些选项总是对所有的 Vim 生效,但有些其他的就可以仅对单一的缓冲生效。

切换到 foo 然后运行下面的命令:

:setlocal wrap

现在切换到 bar 然后运行这个命令:

:setlocal nowrap

把你的 Vim 窗口缩小一些,你就可以看到在 foo 里面的行被换行了,但是在 bar 里面的就没有。

我们再试试其他的选项,切换到 foo 然后运行这个命令:

:setlocal number

然后切换到 bar 然后运行这个命令:

:setlocal nonumber

现在你的 foo 显示行号,但 bar 里面没有。

不是所有的选项都可以用 setlocal 设置的,如果要局部设置一个选项,阅读一下它的 :help

现在我掩盖了关于局部选项如何实际工作的一些细节,在练习里面你会知道更多【这些内容】。

覆盖(Shadowing)

在我们继续之前,让我们看一下局部映射的一些有趣的特性。切换到 foo 然后运行下面的命令:

:nnoremap <buffer> Q x :nnoremap          Q dd

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

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

切回到 bar 然后输入 Q,可以看到这次 Vim 执行了第二个映射,因为它没有被第一个映射所覆盖。

练习

阅读 :help local-options

阅读 :help setlocal

阅读 :help map-local


【转载请附】愿以此功德,回向 >>

原文链接:https://www.huangwenchao.com.cn/2014/10/vimscript-hard-11.html【Learning Vimscript The Hard Way — (11) Buffer-Local Options and Mappings/缓冲区局部设置和映射】

发表评论

电子邮件地址不会被公开。 必填项已用*标注