Vimscript 自動(dòng)命令組

2018-02-24 16:02 更新

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

:autocmd BufWrite * :echom "Writing buffer!"

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

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

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

:autocmd BufWrite * :echom "Writing buffer!"

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

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

這會(huì)有什么問題?

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

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

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

:autocmd BufWrite * :sleep 200m

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

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

再次寫文件。這次會(huì)更明顯。

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

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

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

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

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

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

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

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

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

清除自動(dòng)命令組

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

如果你認(rèn)為Vim會(huì)替換那個(gè)組,那么你猜錯(cuò)了。不要緊,很多人剛開始的時(shí)候都會(huì)這么想(我也是)。

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

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

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

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

在Vimrc中使用自動(dòng)命令

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

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

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

當(dāng)進(jìn)入filetype_html這個(gè)組的時(shí)候,我們會(huì)立即清除這個(gè)組,然后定義一個(gè)自動(dòng)命令,然后退出這個(gè)組。當(dāng)我們?cè)俅渭虞d~/.vimrc文件的時(shí)候,清除組命令會(huì)阻止Vim添加一個(gè)一模一樣的自動(dòng)命令。

練習(xí)

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

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

閱讀:help autocmd-groups

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)