Vim 入门教程 Vimscript 本地缓冲区的选项设置和映射

2024-02-25 开发教程 Vim 入门教程 匿名 1

现在我们先花点时间复习一下我们已经谈论过的三个东西:映射(mappings),缩写(abbreviations)和选项设置(options),这个过程中会讲到一些新的东西。我们将在一个单一的缓冲区中同时设置它们。

这一章所讲到的东西会在下一章中真正的显示它们的作用,目前我们只需先打下基础。

在这一章中你需要在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会删除当前行,也没有什么新鲜的。

ok,现在来点新鲜的:在文件bar下敲击<leader>x

Vim只删除了一个字符,而不是删除整个行! 为什么会这样?

第二个nnoremap命令中的<buffer>告诉Vim这个映射只在定义它的那个缓冲区中有效:

当你在bar文件下敲击<leader>x,Vim找不到一个跟它匹配的映射,它将会被解析了两个命令:<leader>(这个什么都不会干)和 x(通常会删除一个字符)。

本地Leader

在这个例子中,<leader>x是一个本地缓冲区映射,不过这种定义方式并不合适。如果我们需要设定一个只会用于特定缓冲区的映射,一般会使用<localleader>,而不是<leader>

使用两种不同的leader按键就像设置了一种命名空间,这会帮助你保证所有不同的映射对你而言更加清晰直接。

但你在编写一个会被其他人用到的插件的时候,这点显得尤其重要。使用<localleader>来设置本地映射会防止你的插件覆盖别人用<leader>设置的全局映射,因为他们可能已经对他们做设置的全局映射非常之习惯了。

设置

在这本书的前面几个章节里,我们谈论了使用set来设置选项。有一些选项总是会适用于整个Vim,但是有些选项可以基于缓冲区进行设置。

切回到文件foo,执行下面的命令:

:setlocal wrap

然后切换到文件bar,执行下面的命令:

:setlocal nowrap

把你的Vim窗口调小一些,你会发现有些行在foo中会自动换行,而在bar中则不会。

让我们来测试下另外一个选项。切换到foo执行下面的命令:

:setlocal number

现在切换到bar,然后执行下面的命令:

:setlocal nonumber

现在在文件foo中会出现行号,而在bar则没有。

不是所有的选项都可以使用setlocal进行设置。如果你想知道某个特定的选项是否可以设置为本地选项,执行:help查看它的帮助文档。

对于本地选项如何_真正地_地工作,我说的有些简略。在练习中你会学到更多这方面的细节。

遮盖

ok,在开始下一节之前,我们先来看关于本地映射的一个非常有趣的特性。切换到文件foo,然后执行下面的命令:

:nnoremap <buffer> Q x
:nnoremap Q dd

然后敲击Q,看看会发生什么?

当你敲击Q,Vim会执行第一个映射,而不是第二个,因为第一个映射比起第二个要显得更具体,这可以看成第二个映射被第一个映射遮盖了。

切换回文件bar,然后敲击Q,Vim会使用第二个映射。这是因为在这个缓冲区中第二个映射没有被第一个映射遮盖。

练习

阅读:help local-options

阅读:help setlocal

阅读:help map-local