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 插件定义的自动命令的情况下写入文件。