W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
前面幾章我們學(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的速度。
對于這個問題,Vim有一個解決方案。這個解決方案的第一步是將相關(guān)的自動命令收集起來放到一個已命名的組(groups)中。
新開一個Vim實例,這樣可以清除之前所創(chuàng)建的自動命令。然后運行下面的命令:
:augroup testgroup
: autocmd BufWrite * :echom "Foo"
: autocmd BufWrite * :echom "Bar"
:augroup END
中間兩行的縮進沒有什么含義,如果你不想輸入的話可以不輸。
將一個緩沖區(qū)寫入文件然后執(zhí)行:messages
。你應(yīng)該可以在消息日志列表中看到Foo
和Bar
。現(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
在消息列表中。
既然我們現(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添加一個一模一樣的自動命令。
查看你的~/.vimrc
文件,然后把所有的自動命令用上面組的方式包裹起來。如果你覺得有必要,可以把多個自動命令放到一個組里面。
想想上一節(jié)的示例中的自動命令是干啥的。
閱讀:help autocmd-groups
。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: