Nvim :help
页面,生成自 源代码 使用 tree-sitter-vimdoc 解析器。
*.c
的文件。您还可以使用自动命令来实现高级功能,例如编辑压缩文件(请参见 gzip-example)。将自动命令放在 vimrc 文件中的通常位置。{event}
{aupat}
[++once] [++nested] {cmd}
将 {cmd}
添加到 Vim 将在 {event}
上自动执行的命令列表中,用于匹配 {aupat}
的文件 autocmd-pattern。注意:引号字符被视为 :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>" 会在定义 autocmd 时扩展。示例: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}
{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' 的新值。无法切换窗口或缓冲区。请参阅 filetypes。 FileWriteCmd<amatch>
和 <afile>
都设置为函数的名称。 注意: 在编写 Vim 脚本时,更好的方法是使用自动加载函数。请参阅 autoload-functions。 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{aupat}
是 :autocmd
的参数,可以是逗号分隔的列表。这就像使用每个模式单独执行命令一样。因此,此命令: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无法为不存在的缓冲区定义缓冲区局部自动命令。
{name}
为以下 ":autocmd" 命令定义自动命令组名。名称 "end" 或 "END" 选择默认组。为了避免混淆,名称应该与现有的 {event}
名称不同,因为这很可能不会按预期工作。{name}
删除自动命令组 {name}
。如果仍然存在使用此组的自动命令,请不要使用此命令!如果您仍然这样做,您将收到警告。如果组是当前组,您将收到错误 E936。{name}
”选择组。2. 使用“:au!”删除所有旧的自动命令。3. 定义自动命令。4. 使用“augroup END”返回默认组。:augroup uncompress : au! : au BufEnter *.gz %!gunzip :augroup END这样可以防止自动命令被定义两次(例如,在再次引用 vimrc 文件后)。
browse edit
<nomodeline>
] [group] {event}
[fname] 对当前缓冲区应用与 [fname](默认:当前文件名)匹配的 {event}
的自动命令。当当前文件名与正确模式不匹配、更改设置后或要为特定事件执行自动命令时,可以使用此命令。您也可以在自动命令内部使用此命令,以便将一个扩展名的自动命令建立在另一个扩展名之上。示例:au BufEnter *.cpp so ~/.config/nvim/init_cpp.vim :au BufEnter *.cpp doau BufEnter x.c
<nomodeline>
,则会跳过此操作。您可能希望对加载缓冲区时未使用(例如,User)的事件使用 <nomodeline>
。当没有执行匹配的自动命令时,也会跳过模型行。<nomodeline>
] [group] {event}
[fname] 与“: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”标记当前位置调用 LastMod() 调用 LastMod() 函数执行工作“s”将光标返回到旧位置 LastMod() 函数检查文件是否短于 20 行,然后使用“:g”命令查找包含“Last modified: ”的行。对于这些行,会执行“:s”命令以将现有日期替换为当前日期。使用“:execute”命令是为了能够对“:g”和“:s”命令使用表达式。使用 strftime() 函数获取日期。您可以更改其参数以获取另一个日期字符串。
<Tab>
、CTRL-D
等)。:noautocmd w fname.gz这将在不触发 gzip 插件定义的自动命令的情况下写入文件。