如何即时启用/禁用augroup?


13

augroup在自己的文件.vimrc夹中创建了一个,autocmd并且需要autocommand即时启用/禁用这些控件。

这个想法是创建一个映射(F4比如说),该映射将在一次按下时启用这些自动命令,而在再次按下时禁用这些自动命令,而无需提供文件或重新加载.vimrc

我怎样才能做到这一点?

Answers:


17

根据您的答案:您不需要变量来保持的状态,只要您知道该组中的至少一个,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>

嘿,很酷的改善方法!我不知道你能做到
statox

1
您甚至可以将组分为两部分,并else通过autocmd!在开始时无条件运行来删除分支。
VanLaser

@VanLaser可以吗?您是否尝试过这种方式?提示:exists('#TestAutoGroup#BufEnter')之后会返回什么autocmd!
佐藤桂2015年

1
大概是这样的:pastebin.com/HEEYjseR
VanLaser 2015年

1
@VanLaser然后,您可以通过删除该全局变量来使该操作变为无状态。也许有一个函数可以解决这个问题。该功能可能需要...哦。对。:)
佐藤桂2015年

9

(我实际上是自己弄清楚的,但是由于我没有在该站点上找到答案,所以我认为这对于创建一个自我回答的问题可能很有用)

为此,可以创建以下函数并将其放入.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

在此版本中,组始终会重置,如果未启用该组,则会使用所需的自动命令填充该组


7

我发现简单的方法是使用全局变量。例:

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

我不确定您为什么认为这是一种简单的方法:我不是vimscript大师,所以您的语法对我来说有点过于复杂。您的方法有哪些优点?
statox

优点:1)没有功能。2)可以很容易地适应使用缓冲区/窗口局部变量而不是全局变量。3)简单映射
Peter Rincker

好。感谢您分享您的解决方案,我不会想到要这样做!
statox
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.