W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
前面幾章我們學(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沒(méi)辦法知道你是想替換第一個(gè)自動(dòng)命令。在上面的示例中,Vim創(chuàng)建了兩個(gè)_不同_的自動(dòng)命令,并且這兩個(gè)命令剛好做同樣的事情。
既然你現(xiàn)在知道了Vim可能創(chuàng)建兩個(gè)完全一樣的自動(dòng)命令,你可能會(huì)想:“有什么大不了?只要?jiǎng)e這么干就可以!”。
問(wèn)題是當(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)然也你可能注意不到。現(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)命令,不過(guò)一個(gè)使用Vim的老鳥(niǎo)的~/.vimrc
文件可以輕易達(dá)到1000行,其中會(huì)有很多自動(dòng)命令。再加上安裝的插件中的自動(dòng)命令,這肯定會(huì)影響Vim的速度。
對(duì)于這個(gè)問(wèn)題,Vim有一個(gè)解決方案。這個(gè)解決方案的第一步是將相關(guān)的自動(dòng)命令收集起來(lái)放到一個(gè)已命名的組(groups)中。
新開(kāi)一個(gè)Vim實(shí)例,這樣可以清除之前所創(chuàng)建的自動(dòng)命令。然后運(yùn)行下面的命令:
:augroup testgroup
: autocmd BufWrite * :echom "Foo"
: autocmd BufWrite * :echom "Bar"
:augroup END
中間兩行的縮進(jìn)沒(méi)有什么含義,如果你不想輸入的話可以不輸。
將一個(gè)緩沖區(qū)寫入文件然后執(zhí)行:messages
。你應(yīng)該可以在消息日志列表中看到Foo
和Bar
。現(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ì)了沒(méi)。
當(dāng)你寫入文件的時(shí)候發(fā)生什么了?猜對(duì)了么?
如果你認(rèn)為Vim會(huì)替換那個(gè)組,那么你猜錯(cuò)了。不要緊,很多人剛開(kāi)始的時(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
在消息列表中。
既然我們現(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)命令。
查看你的~/.vimrc
文件,然后把所有的自動(dòng)命令用上面組的方式包裹起來(lái)。如果你覺(jué)得有必要,可以把多個(gè)自動(dòng)命令放到一個(gè)組里面。
想想上一節(jié)的示例中的自動(dòng)命令是干啥的。
閱讀:help autocmd-groups
。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: