Vimscript 自動命令組

2018-02-24 16:02 更新

前面幾章我們學(xué)習(xí)了自動命令。執(zhí)行下面命令:

:autocmd BufWrite * :echom "Writing buffer!"

現(xiàn)在使用:write命令將當(dāng)前緩沖區(qū)寫入文件,然后執(zhí)行:messages命令查看消息日志。你會看到Writing buffer!在消息列表中。

然后將當(dāng)前緩沖區(qū)寫入文件,執(zhí)行:messages查看消息日志。你會看到Writing buffer!在消息列表中出現(xiàn)了兩次。

現(xiàn)在再次執(zhí)行上面的自動命令:

:autocmd BufWrite * :echom "Writing buffer!"

再次將當(dāng)前緩沖區(qū)寫入文件并執(zhí)行:messages命令。你會看到Writing buffer!在消息列表中出現(xiàn)了_4_次,這是怎么回事?

這是因為當(dāng)你以上面的方式創(chuàng)建第二個自動命令的時候,Vim沒辦法知道你是想替換第一個自動命令。在上面的示例中,Vim創(chuàng)建了兩個_不同_的自動命令,并且這兩個命令剛好做同樣的事情。

這會有什么問題?

既然你現(xiàn)在知道了Vim可能創(chuàng)建兩個完全一樣的自動命令,你可能會想:“有什么大不了?只要別這么干就可以!”。

問題是當(dāng)你加載你的~/.vimrc文件的時候,Vim會重新讀取整個文件,包括你所定義的任何自動命令!這就意味著每次你加載你的~/.vimrc文件的時候,Vim都會復(fù)制之前的自動命令,這會降低Vim的運行速度,因為它會一次又一次地執(zhí)行相同的命令。

你可以執(zhí)行下面的命令模擬這種情況:

:autocmd BufWrite * :sleep 200m

現(xiàn)在將當(dāng)前緩沖區(qū)寫入文件。你可能注意到Vim在寫入文件的時候有點緩慢,當(dāng)然也你可能注意不到?,F(xiàn)在執(zhí)行上面的自動命令三次:

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

再次寫文件。這次會更明顯。

當(dāng)然你不會創(chuàng)建任何只是進行sleep而不做任何事情的自動命令,不過一個使用Vim的老鳥的~/.vimrc文件可以輕易達到1000行,其中會有很多自動命令。再加上安裝的插件中的自動命令,這肯定會影響Vim的速度。

把自動命令放到組中(Grouping Autocommands)

對于這個問題,Vim有一個解決方案。這個解決方案的第一步是將相關(guān)的自動命令收集起來放到一個已命名的組(groups)中。

新開一個Vim實例,這樣可以清除之前所創(chuàng)建的自動命令。然后運行下面的命令:

:augroup testgroup
:    autocmd BufWrite * :echom "Foo"
:    autocmd BufWrite * :echom "Bar"
:augroup END

中間兩行的縮進沒有什么含義,如果你不想輸入的話可以不輸。

將一個緩沖區(qū)寫入文件然后執(zhí)行:messages。你應(yīng)該可以在消息日志列表中看到FooBar。現(xiàn)在執(zhí)行下面的命令:

:augroup testgroup
:    autocmd BufWrite * :echom "Baz"
:augroup END

當(dāng)你再次將緩沖區(qū)寫入文件的時候猜猜會發(fā)生什么。ok,你也許已經(jīng)有結(jié)果了,重新寫入緩沖區(qū),然后執(zhí)行:messages命令,看看你猜對了沒。

清除自動命令組

當(dāng)你寫入文件的時候發(fā)生什么了?猜對了么?

如果你認為Vim會替換那個組,那么你猜錯了。不要緊,很多人剛開始的時候都會這么想(我也是)。

當(dāng)你多次使用augroup的時候,Vim每次都會組合那些組。

如果你想清除一個組,你可以把autocmd!這個命令包含在組里面。執(zhí)行下面的命令:

:augroup testgroup
:    autocmd!
:    autocmd BufWrite * :echom "Cats"
:augroup END

現(xiàn)在試試寫入文件然后執(zhí)行:messages查看消息日志。這次Vim只會輸出Cats在消息列表中。

在Vimrc中使用自動命令

既然我們現(xiàn)在知道了怎么把自動命令放到一個組里面以及怎么清除這些組,我們可以使用這種方式將自動命令添加到~/.vimrc中,這樣每次加載它的時候就不會復(fù)制自動命令了。

添加下面的命令到你的~/.vimrc文件中:

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

當(dāng)進入filetype_html這個組的時候,我們會立即清除這個組,然后定義一個自動命令,然后退出這個組。當(dāng)我們再次加載~/.vimrc文件的時候,清除組命令會阻止Vim添加一個一模一樣的自動命令。

練習(xí)

查看你的~/.vimrc文件,然后把所有的自動命令用上面組的方式包裹起來。如果你覺得有必要,可以把多個自動命令放到一個組里面。

想想上一節(jié)的示例中的自動命令是干啥的。

閱讀:help autocmd-groups。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號