vim_thumb

Learning Vimscript The Hard Way — (14) Autocommand Groups/自动命令组

自动命令组

前几章我们学习了有关自动命令的知识,运行下面的命令:

:autocmd BufWrite * :echom “Writing Buffer!”

现在用 :write 保存当前的缓冲区,然后运行 :messages 来看一下日志里面的消息。你应当看到列表中有 Writing Buffer! 被记录下来。

现在再将第一个缓冲区保存一下,然后运行 :messages 来看一下日志。你应当看到列表中 Writing Buffer! 的消息出现了两次。

现在再运行一次同样的自动命令:

:autocmd BufWrite * :echom “Writing buffer!”

再保存一次缓冲区,然后运行 :messages。你会看到 Writing Buffer! 的消息在列表出现了四次,发生了什么呢?

当你像这样创建了一个自动命令,Vim 没办法知道你是否要替换掉现在已经存在的那个。在我们的例子中,Vim 分别创建了两个自动命令,他们刚好执行相同的事情。

问题

既然你知道自动命令是可以被重复创建的,你可能会想:“那又怎样?不要这么做不就行了!”

问题在于当你 source ~/.vimrc 的时候,整个文件会重新读取【执行】,包括你定义过的任意自动命令。意思就是说,每次你 source 一次你的 ~/.vimrc 你会把自动命令重复一次,这会是你的 Vim 运行得越来越慢,因为它一次又一次地执行同一个命令。

为了模拟这个,尝试运行下面的命令:

:autocmd BufWrite * :sleep 200m

现在写入一下当前缓冲区,你有意无意会留意到 Vim 在写入的时候会产生一个轻微的卡顿。现在再运行同一个命令三次:

:autocmd BufWrite * :sleep 200m :autocmd BufWrite * :sleep 200m :autocmd BufWrite * :sleep 200m

在写入一下文件。这次卡顿会明显许多。

很明显你不会写一个自动命令仅仅停顿一下却不干任何事情,但是一个 Vim 老手它的 ~/.vimrc 文件可能分分钟达到 1000 行以上,其中许多都会是自动命令。这些自动命令和已安装插件中定义的那些混在一起的话,肯定会影响到性能。

分组自动命令

Vim 对这个问题有一个解决方案。第一步就是将相关的自动命令组织到命名组当中。

打开一个新的干净的 Vim 实例,以确保之前定义的自动命令都被清掉了,然后运行下面的命令:

:augroup testgroup :    autocmd BufWrite * :echom “Foo” :    autocmd BufWrite * :echom “Bar” :augroup END

中间两行的缩进无所谓,你不想输入也可以。

写入一下缓冲区然后查一下 :messages。你会同时看到 FooBar。现在运行下面的命令:

:augroup testgroup :    autocmd BufWrite * :echom “Baz” :augroup END

再猜一下当你保存缓冲区的时候会发生什么?先猜一下,然后写入缓冲区,查一下 :messages 看你猜对没有。

【译注:

我当时猜后面的会把前面的替换掉,不过我猜错了,现在依然是会把上面所有的三个自动命令都执行,输出三行。

清空组

你写入文件的时候发生了什么?是不是像你猜的那样?【真会卖关子】

如果你才 Vim 会替换整个组,你会看到你猜错了。别担心,据我所知,大多数人第一次看到这个都是这样想的。

当你使用 augroup 多次的时候,他会把每次的组都组合在一起。

如果你想清空一个组,你可以在组里面使用 autocmd!。运行下面的命令:

:augroup testgroup :    autocmd! :    autocmd BufWrite * :echom “Cats” :augroup END

现在试一下写入你的文件然后查一下 :messages。这次当你写入文件的时候 Vim 只会输出 Cats

在你的 Vimrc 里面使用自动命令

现在我们已经知道如何分组自动命令然后清空这些组,我们可以用这个向 ~/.vimrc 里面添加命令,但不会在每次 source 它的时候都产生重复。

将下面的东西加到你的 ~/.vimrc 文件中。

augroup filetype_html     autocmd!     autocmd FileType html nnoremap <buffer> <localleader>f Vatzf augroup END

我们进入 filetype_html 组,立即清空它,定义一个自动命令,然后离开这个组。如果我们重新 source ~/.vimrc 的话,这个清空就可以防止 Vim 加入重复的命令了。

练习

再检查一遍你的 ~/.vimrc 文件然后将每个自动命令都用组包起来。你可以合理地将多个自动命令放在同一个组里面。

尝试指出最后一个例子里面的映射做了什么。

阅读 :help autocmd-groups


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

原文链接:https://www.huangwenchao.com.cn/2014/10/vimscript-hard-14.html【Learning Vimscript The Hard Way — (14) Autocommand Groups/自动命令组】

发表评论

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