Nvim 的 :help
頁面,是從 原始碼 使用 tree-sitter-vimdoc 解析器 產生 而來。
*.c
的檔案設定 'cindent' 選項。您也可以使用自動指令來實現進階功能,例如編輯壓縮檔案 (請參閱 gzip-example)。通常將自動指令放置在您的 vimrc 檔案中。{event}
{aupat}
[++once] [++nested] {cmd}
將 {cmd}
新增到 Vim 會自動執行的命令清單中,當檔案符合 {aupat}
autocmd-pattern 時,會在 {event}
觸發。 注意: 引號字元會被視為 :autocmd 的參數,且不會開始註解。Nvim 總是在現有的自動指令之後新增 {cmd}
,以便它們按照定義的順序執行。關於 [++nested],請參閱 autocmd-nested。autocmd-once<buffer>
或 <buffer=N> 定義了緩衝區本機自動指令。請參閱 autocmd-buflocal。:augroup mine | au! BufRead | augroup END但是這會將 "augroup" 視為已定義命令的一部分
:augroup mine | au! BufRead * | augroup END :augroup mine | au BufRead * set tw=70 | augroup END您可以將群組名稱放入命令中
:au! mine BufRead * :au mine BufRead * set tw=70或者使用
:execute
:augroup mine | exe "au! BufRead *" | augroup END :augroup mine | exe "au BufRead * set tw=70" | augroup END
{cmd}
時展開。唯一的例外是 "<sfile>" 在定義自動指令時展開。範例:au BufNewFile,BufRead *.html so <sfile>:h/html.vim這裡 Vim 會將
<sfile>
展開為包含此行的檔案名稱。:autocmd
會將自動指令新增到清單中,無論它們是否已經存在。當您的 .vimrc 檔案被執行兩次時,自動指令會出現兩次。為了避免這種情況,請在群組中定義您的自動指令,以便您可以輕鬆地清除它們augroup vimrc " Remove all vimrc autocommands autocmd! au BufNewFile,BufRead *.html so <sfile>:h/html.vim augroup END如果您不想移除所有自動指令,則可以使用變數來確保 Vim 只包含一次自動指令
:if !exists("autocommands_loaded") : let autocommands_loaded = 1 : au ... :endif當未提供 [group] 引數時,Vim 會使用目前的群組(使用 ":augroup" 定義);否則,Vim 會使用以 [group] 定義的群組。請注意,[group] 必須事先定義。您無法使用 ":au group ..." 定義新的群組;請改用 ":augroup"。
:set verbose=9此設定會使 Vim 在執行自動指令時將它們回顯出來。
{event}
{aupat}
[++once] [++nested] {cmd}
移除與 {event}
和 {aupat}
相關的所有自動指令,並新增命令 {cmd}
。關於 [++once],請參閱 autocmd-once。關於 [++nested],請參閱 autocmd-nested。{event}
{aupat}
移除與 {event}
和 {aupat}
相關的所有自動指令。{aupat}
移除與所有事件的 {aupat}
相關的所有自動指令。{event}
移除 {event}
的所有自動指令。 警告: 您不應該在沒有為 BufRead 和其他常見事件建立群組的情況下執行此操作,這可能會破壞外掛程式、語法突顯等。{event}
{aupat}
顯示與 {event}
和 {aupat}
相關的自動指令。{aupat}
顯示與所有事件的 {aupat}
相關的自動指令。{event}
顯示 {event}
的所有自動指令。<buffer>
或 <buffer=N> 形式的模式。請參閱 autocmd-buflocal。:verbose autocmd BufEnter FileExplorer BufEnter * call s:LocalBrowse(expand("<amatch>")) Last set from /usr/share/vim/vim-7.0/plugin/NetrwPlugin.vim
'modified'
值變更之後。BufNew:read file
指令<amatch>
和 <afile>
都會擴展為命令名稱。 注意:在定義命令之前,自動完成功能將無法運作。另一種方法是始終定義使用者命令,並讓它調用自動載入的函式。請參閱 autoload。CmdlineChanged<afile>
會擴展為 cmdline-char。CmdlineEnter<afile>
會擴展為 cmdline-char。設定這些 v:event 鍵:cmdlevel cmdtype。CmdlineLeave<afile>
會擴展為 cmdline-char。設定這些 v:event 鍵:abort (可變) cmdlevel cmdtype。 注意:abort
只能從 false 變更為 true:無法透過將其變更為 false 來執行已中止的命令列。CmdwinEnter<afile>
會擴展為單個字元,表示命令列的類型。cmdwin-char。CmdwinLeave<afile>
會擴展為單個字元,表示命令列的類型。cmdwin-char。ColorScheme<afile>
可用於此選項實際設定的檔案名稱,而 <amatch>
則可用於新的色彩配置名稱。<CursorHold>
按鍵觸發。在運算式映射中,getchar() 可能會看到此字元。:let &ro = &ro
CTRL-V
之後,也不會在 CTRL-X
模式中觸發 insert_expand。<afile>
會擴展為 cmdline-char。CursorMovedI:lcd
時觸發、「tabpage」在 :tcd
時觸發、「global」在 :cd
時觸發、「auto」在'autochdir'時觸發。會設定這些 v:event 鍵:cwd:目前工作目錄,scope: "global"、"tabpage"、"window",changed_window:如果我們因切換視窗(或標籤頁)而觸發事件,則為 v:true,<afile>
會設定為新的目錄名稱。非遞迴(事件無法觸發自身)。DirChangedPre<afile>
會設定為新的目錄名稱。非遞迴(事件無法觸發自身)。ExitPre:quit
、:wq
以會使 Vim 結束的方式,或使用 :qall
時,在 QuitPre 之後觸發。可用於關閉任何非必要的視窗。如果存在未自動儲存的已修改緩衝區,則退出可能仍然會被取消,請使用 VimLeavePre 進行真正的退出。另請參閱 QuitPre、WinClosed。FileAppendCmd<afile>
是設定此選項的檔案名稱。<amatch>
是 'filetype' 的新值。無法切換視窗或緩衝區。請參閱 檔案類型。FileWriteCmd<amatch>
和 <afile>
都會設定為函數名稱。注意:當編寫 Vim 指令碼時,更好的選擇是使用自動載入的函數。請參閱 自動載入函數。UIEnter<Insert>
時觸發。v:insertmode 變數會指示新模式。請小心不要移動游標或執行任何使用者不期望的操作。InsertCharPreCTRL-O
i_CTRL-O 時也會觸發。請小心不要變更模式或使用 :normal
,這很可能會造成問題。InsertLeaveCTRL-O
i_CTRL-O 時也會觸發。但不適用於 i_CTRL-C。MenuPopup'old_mode:new_mode'
,例如比對 *:c
來模擬 CmdlineEnter。會設定以下 v:event 值:old_mode 變更前的模式。new_mode 新模式,也由以非零參數呼叫的 mode() 傳回。當觸發 ModeChanged 時,old_mode 的值會是上次觸發事件時 new_mode 的值。這將在每次輕微的模式變更時觸發。使用範例:在進入可視模式時使用相對行號:au ModeChanged [vV\x16]*:* let &l:rnu = mode() =~# '^[vV\x16]' :au ModeChanged *:[vV\x16]* let &l:rnu = mode() =~# '^[vV\x16]' :au WinEnter,WinLeave * let &l:rnu = mode() =~# '^[vV\x16]'
:quit
、:wq
或 :qall
時,在決定是否關閉目前視窗或退出 Vim 之前。對於 :wq
,會在觸發 QuitPre 之前寫入緩衝區。如果目前視窗是最後一個普通視窗,則可以使用它來關閉任何非必要的視窗。另請參閱 ExitPre、WinClosed。RemoteReply{serverid}
進行比對。<amatch>
等於傳送回覆的 {serverid}
,而 <afile>
則是實際的回覆字串。請注意,即使定義了自動命令,也應使用 remote_read() 讀取回覆以使用它。SearchWrappedmode()
來找出 Vim 處於哪個狀態。可能是state()
檢查更多內容,例如螢幕是否已針對訊息捲動。autocmd Signal SIGUSR1 call some#func()
<afile>
是要載入的檔案名稱。SourcePost<afile>
是要載入的檔案名稱。如果載入被中斷,則不會觸發。在觸發 SourceCmd 自動命令之後也會觸發。SourceCmd<afile>
是要載入的檔案名稱。自動命令必須載入該檔案。Cmd-event SpellFileMissing<amatch>
是語言,'encoding' 也很重要。請參閱 spell-SpellFileMissing。StdinReadPost<afile>
是正在編輯的檔案。v:swapcommand 可能包含要在開啟的檔案中執行的命令。這些命令應將 v:swapchoice 變數設定為具有一個字元的字串,以告知 Vim 接下來應執行什麼操作: 'o' 以唯讀方式開啟 'e' 無論如何編輯檔案 'r' 復原 'd' 刪除交換檔案 'q' 退出,不要編輯檔案 'a' 中止,如同按下 CTRL-C
當設定為空字串時,將會詢問使用者,就像沒有 SwapExists 自動命令一樣。E812<afile>
會展開為設定此選項的檔案名稱。<amatch>
會展開為 'syntax' 的新值。請參閱 :syn-on。TabEnter<afile>
會展開為索引標籤頁面編號。TermOpen-- Query the terminal palette for the RGB value of color 1
-- (red) using OSC 4
vim.api.nvim_create_autocmd('TermResponse', {
once = true,
callback = function(args)
local resp = args.data
local r, g, b = resp:match("\027%]4;1;rgb:(%w+)/(%w+)/(%w+)")
end,
})
io.stdout:write("\027]4;1;?\027\\")
:noautocmd
跳過。請小心:這會非常頻繁地觸發,請勿執行使用者不期望或速度慢的任何操作。TextChangedIinclusive
旗標與 '[ 和 '] 標記結合使用,可以用來計算操作的精確區域。:autocmd User MyPlugin echom 'got MyPlugin event' :doautocmd User MyPlugin
if v:vim_did_enter call s:init() else au VimEnter * call s:init() endif
:autocmd VimLeavePre * call CleanupStuff()
<amatch>
和 <afile>
都會設定為視窗 ID。在 WinLeave 之後觸發。非遞迴 (事件無法觸發自身)。另請參閱ExitPre、QuitPre。WinEnter:autocmd
的 {aupat}
引數可以是逗號分隔的列表。這就像是分別為每個模式提供指令一樣。因此,此指令:autocmd BufRead *.txt,*.info set et等同於
:autocmd BufRead *.txt set et :autocmd BufRead *.info set et檔案模式
{aupat}
會以兩種方式測試是否與檔案名稱相符: 1. 當模式中沒有 '/' 時,Vim 只會檢查是否與檔案名稱的尾部 (不包含其開頭的目錄路徑) 相符。 2. 當模式中有 '/' 時,Vim 會檢查是否與短檔案名稱 (您輸入的名稱) 和完整檔案名稱 (展開為完整路徑並解析符號連結後) 相符。<buffer>
或 <buffer=N> 用於緩衝區本機自動指令 autocmd-buflocal。此模式不會與緩衝區的名稱比對。:autocmd BufRead *.txt set et為所有文字檔案設定 'et' 選項。
:autocmd BufRead /vim/src/*.c set cindent為 /vim/src 目錄中的 C 檔案設定 'cindent' 選項。
:autocmd BufRead /tmp/*.c set ts=5如果您有從 "/tmp/test.c" 到 "/home/nobody/vim/src/test.c" 的連結,並且您開始編輯 "/tmp/test.c",則此自動指令會相符。
:autocmd BufRead */doc/*.txt set tw=78例如,此自動指令將會為 "/tmp/doc/xx.txt" 和 "/usr/home/piet/doc/yy.txt" 執行。目錄的數量在這裡並不重要。
:e $ROOTDIR/main.$EXT引數會先展開為
/usr/root/main.py然後才與自動指令的模式比對。在使用 FileReadCmd 等事件時請小心,
<amatch>
的值可能與您預期的不同。:autocmd BufRead $VIMRUNTIME/doc/*.txt set expandtab而且 ~ 可以用於主目錄 (如果已定義 $HOME)
:autocmd BufWritePost ~/.config/nvim/init.vim so <afile> :autocmd BufRead ~archive/* set readonly環境變數會在定義自動指令時展開,而不是在執行自動指令時展開。這與指令不同!
au BufEnter *.foo bdel au BufEnter *.foo set modified這將會刪除目前緩衝區,然後在已成為目前緩衝區的緩衝區中設定 'modified'。Vim 不會考慮到 "*.foo" 與該緩衝區名稱不相符。它會將 "*.foo" 與事件觸發時緩衝區的名稱比對。
<buffer>
目前緩衝區 <buffer=99> 緩衝區編號 99 <buffer=abuf> 使用 <abuf>
(僅在執行自動指令時) <abuf>:au CursorHold <buffer> echo 'hold' :au CursorHold <buffer=33> echo 'hold' :au BufNewFile * au CursorHold <buffer=abuf> echo 'hold'自動指令的所有指令也適用於緩衝區本機自動指令,只需使用特殊字串而不是模式即可。範例
:au! * <buffer> " remove buffer-local autocommands for " current buffer :au! * <buffer=33> " remove buffer-local autocommands for " buffer #33 :bufdo :au! CursorHold <buffer> " remove autocmd for given event for all " buffers :au * <buffer> " list buffer-local autocommands for " current buffer請注意,當為目前緩衝區定義自動指令時,它會與緩衝區編號一起儲存。因此,它會使用 "<buffer=12>" 形式,其中 12 是目前緩衝區的編號。例如,當列出自動指令時,您會看到此內容。
:if exists("#CursorHold#<buffer=12>") | ... | endif :if exists("#CursorHold#<buffer>") | ... | endif " for current buffer當清除緩衝區時,其緩衝區本機自動指令當然也會消失。請注意,當刪除緩衝區時,例如使用 ":bdel",它只會變成未列出,自動指令仍然存在。若要查看移除緩衝區本機自動指令
:set verbose=6無法為不存在的緩衝區定義緩衝區本機自動指令。
{名稱}
為以下 ":autocmd" 指令定義自動指令群組名稱。名稱 "end" 或 "END" 選擇預設群組。為避免混淆,名稱應與現有的 {事件}
名稱不同,因為這很可能不會達到您預期的效果。{名稱}
刪除自動指令群組 {名稱}
。如果仍有自動指令使用此群組,請勿使用此指令!如果這樣做,您將收到警告。當群組是目前群組時,您將收到錯誤 E936。{名稱}
" 選取群組。2. 使用 ":au!" 刪除任何舊的自動指令。3. 定義自動指令。4. 使用 "augroup END" 返回預設群組。:augroup uncompress : au! : au BufEnter *.gz %!gunzip :augroup END這可以防止自動指令被定義兩次(例如,在再次執行 vimrc 檔案後)。
browse edit
<nomodeline>
] [群組] {事件}
[檔案名稱] 將符合 [檔案名稱] 的自動指令(預設值:目前檔案名稱)套用至目前緩衝區。您可以在目前檔案名稱與正確的模式不符、變更設定後,或為特定事件執行自動指令時使用此指令。也可以在自動指令內使用此指令,以便您可以將一個擴充功能的自動指令建立在另一個擴充功能之上。範例:au BufEnter *.cpp so ~/.config/nvim/init_cpp.vim :au BufEnter *.cpp doau BufEnter x.c
<nomodeline>
,則會跳過此步驟。您可能希望對載入緩衝區時不使用的事件使用 <nomodeline>
,例如 User。如果沒有執行符合的自動指令,也會跳過模型行。<nomodeline>
] [群組] {事件}
[檔案名稱] 類似於 ":doautocmd",但會將自動指令套用至每個已載入的緩衝區。目前的緩衝區最後執行。augroup mine autocmd! autocmd FileType * echo expand('<amatch>') augroup END doautoall mine FileType Loaded-Buffer
:augroup gzip : autocmd! : autocmd BufReadPre,FileReadPre *.gz set bin : autocmd BufReadPost,FileReadPost *.gz '[,']!gunzip : autocmd BufReadPost,FileReadPost *.gz set nobin : autocmd BufReadPost,FileReadPost *.gz execute ":doautocmd BufReadPost " .. expand("%:r") : autocmd BufWritePost,FileWritePost *.gz !mv <afile> <afile>:r : autocmd BufWritePost,FileWritePost *.gz !gzip <afile>:r : autocmd FileAppendPre *.gz !gunzip <afile> : autocmd FileAppendPre *.gz !mv <afile>:r <afile> : autocmd FileAppendPost *.gz !mv <afile> <afile>:r : autocmd FileAppendPost *.gz !gzip <afile>:r :augroup END"gzip" 群組用於能夠使用 ":autocmd!" 刪除任何現有的自動指令,以便在檔案被執行兩次時使用。
:autocmd FileChangedShell *.c ++nested e!巢狀限制為 10 層,以避免遞迴迴圈。
<EOL>
時,Vim 會記住這一點。在下一次寫入(使用 ":write file" 或篩選器指令)時,如果將同一行再次寫入為檔案中的最後一行,且設定了 'binary',則 Vim 不會提供 <EOL>
。這使得剛讀取的行上的篩選器指令寫入與讀取相同的檔案,並使得剛篩選的行上的寫入指令寫入與從篩選器讀取的相同檔案。例如,另一種寫入壓縮檔的方法:autocmd FileWritePre *.gz set bin|'[,']!gzip :autocmd FileWritePost *.gz undo|set nobin
:autocmd BufRead * set tw=79 nocin ic infercase fo=2croq :autocmd BufRead .letter set tw=72 fo=2tcrq :autocmd BufEnter .letter set dict=/usr/lib/dict/words :autocmd BufLeave .letter set dict= :autocmd BufRead,BufNewFile *.c,*.h set tw=0 cin noic :autocmd BufEnter *.c,*.h abbr FOR for (i = 0; i < 3; ++i)<CR>{<CR>}<Esc>O :autocmd BufLeave *.c,*.h unabbr FOR用於 makefile(makefile、Makefile、imakefile、makefile.unix 等)
:autocmd BufEnter ?akefile* set include=^s\=include :autocmd BufLeave ?akefile* set include&永遠從第一個函式開始編輯 C 檔案
:autocmd BufRead *.c,*.h 1;/^{如果沒有上方的 "1;",搜尋將從輸入檔案的位置開始,而不是從檔案的開頭開始。
:autocmd BufNewFile *.c 0r ~/vim/skeleton.c :autocmd BufNewFile *.h 0r ~/vim/skeleton.h :autocmd BufNewFile *.java 0r ~/vim/skeleton.java在寫入 "*.html" 檔案時,在其中插入目前的日期和時間
:autocmd BufWritePre,FileWritePre *.html ks|call LastMod()|'s :fun LastMod() : if line("$") > 20 : let l = 20 : else : let l = line("$") : endif : exe "1," .. l .. "g/Last modified: /s/Last modified: .*/Last modified: " .. : \ strftime("%Y %b %d") :endfun您需要在檔案的前 20 行中有一行 "Last modified: <date time>" 才能使其運作。Vim 會將 <date time>(以及同一行中它之後的任何內容)替換為目前的日期和時間。說明:ks 使用標記 's' 標記目前位置 call LastMod() 呼叫 LastMod() 函式以執行工作 's 將游標返回到舊位置 LastMod() 函式會檢查檔案是否少於 20 行,然後使用 ":g" 指令來尋找包含 "Last modified: " 的行。對於這些行,會執行 ":s" 指令以將現有的日期替換為目前的日期。使用 ":execute" 指令來使用 ":g" 和 ":s" 指令的表示式。日期是使用 strftime() 函式取得的。您可以變更其引數以取得另一個日期字串。
<Tab>
、CTRL-D
等)。:noautocmd w fname.gz這將寫入檔案,而不會觸發 gzip 外掛程式所定義的自動指令。