Answers:
根据您的答案:您不需要变量来保持的状态,只要您知道该组中的至少一个,augroup
就可以使用该变量:exists()
autocmd
function! ToggleTestAutoGroup()
if !exists('#TestAutoGroup#BufEnter')
augroup TestAutoGroup
autocmd!
autocmd BufEnter * echom "BufEnter " . bufnr("%")
autocmd BufLeave * echom "BufLeave " . bufnr("%")
autocmd TabEnter * echom "TabEnter " . tabpagenr()
autocmd TabLeave * echom "TabLeave " . tabpagenr()
augroup END
else
augroup TestAutoGroup
autocmd!
augroup END
endif
endfunction
nnoremap <F4> :call ToggleTestAutoGroup()<CR>
else
通过autocmd!
在开始时无条件运行来删除分支。
exists('#TestAutoGroup#BufEnter')
之后会返回什么autocmd!
?
(我实际上是自己弄清楚的,但是由于我没有在该站点上找到答案,所以我认为这对于创建一个自我回答的问题可能很有用)
为此,可以创建以下函数并将其放入.vimrc
:
function! ToggleTestAutoGroup()
if !exists('g:TestAutoGroupMarker')
let g:TestAutoGroupMarker = 1
endif
" Enable if the group was previously disabled
if (g:TestAutoGroupMarker == 1)
let g:TestAutoGroupMarker = 0
" actual augroup
augroup TestAutoGroup
autocmd! BufEnter * echom "BufEnter " . bufnr("%")
autocmd! BufLeave * echom "BufLeave " . bufnr("%")
autocmd! TabEnter * echom "TabEnter " . tabpagenr()
autocmd! TabLeave * echom "TabLeave " . tabpagenr()
augroup END
else " Clear the group if it was previously enabled
let g:TestAutoGroupMarker = 1
" resetting the augroup
augroup TestAutoGroup
autocmd!
augroup END
endif
endfunction
该函数创建一个变量,用于确定该组先前是否已启用。
如果未启用,则使用所需的自动命令填充该组。如果先前启用了该组,则可以使用autocmd!
“重置”它,即删除先前在其中输入的命令。
相关文档在这里
最后,可以创建以下映射:
nnoremap <F4> :call ToggleTestAutoGroup()<CR>
用于F4调用函数。
编辑:Karl YngveLervåg提出了此功能的改进版本,减少了代码行数,我觉得最好保持两个版本的第一个仍在工作,也许像我这样的vimscript初学者更容易理解。
这是Karl的改进功能,非常感谢他:
function! ToggleTestAutoGroup()
" Switch the toggle variable
let g:TestAutoGroupToggle = !get(g:, 'TestAutoGroupToggle', 1)
" Reset group
augroup TestAutoGroup
autocmd!
augroup END
" Enable if toggled on
if g:TestAutoGroupToggle
augroup TestAutoGroup
autocmd! BufEnter * echom "BufEnter " . bufnr("%")
autocmd! BufLeave * echom "BufLeave " . bufnr("%")
autocmd! TabEnter * echom "TabEnter " . tabpagenr()
autocmd! TabLeave * echom "TabLeave " . tabpagenr()
augroup END
endif
endfunction
在此版本中,组始终会重置,如果未启用该组,则会使用所需的自动命令填充该组
我发现简单的方法是使用全局变量。例:
augroup TestAutoGroup
autocmd!
autocmd BufEnter * |
\ if get(g:, 'toggle_autocmd', 1) |
\ echom "BufEnter " . bufnr("%") |
\ endif
augroup END
nnoremap <f4> :<c-u>let g:toggle_autocmd = !get(g:, 'toggle_autocmd', 1)<cr>
有关更多帮助,请参见:
:h g:
:h get()
:h :if
:h :bar
:h line-continuation