Come abilitare / disabilitare un augroup al volo?


13

Ho creato un augroupnel mio .vimrccontenente diversi autocmde ho bisogno di abilitare / disabilitare questi autocommandal volo.

L'idea è quella di creare una mappatura (diciamo F4per esempio) che abiliterebbe questi autocomandi se premuti una volta e disabilitati quando premuti di nuovo senza dover generare un file o ricaricare il file .vimrc.

Come posso fare ciò?

Risposte:


17

Basandoti sulla tua risposta: non hai bisogno di una variabile per mantenere lo stato del augroup, puoi usarlo exists()per questo, a condizione che tu conosca almeno una delle autocmds che fanno parte del gruppo:

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>

Ehi bel modo per migliorarlo! Non sapevo che tu potessi farlo.
statox

1
Puoi anche dividere il gruppo in 2 parti e rimuovere il elseramo, eseguendo autocmd!incondizionatamente all'inizio.
VanLaser,

@VanLaser Potresti? Hai provato a farlo in questo modo? Suggerimento: cosa sarebbe exists('#TestAutoGroup#BufEnter')tornato dopo un autocmd!?
Sato Katsura,

1
Qualcosa del genere, forse: pastebin.com/HEEYjseR
VanLaser

1
@VanLaser E poi potresti rendere quell'operazione senza stato, eliminando quella variabile globale. Forse c'è una funzione che potrebbe occuparsene. Questa funzione potrebbe dover ... Ow. Giusto. :)
Sato Katsura,

9

(In realtà l'ho capito da solo, ma poiché non ho trovato una risposta su questo sito ho pensato che potesse essere utile per creare una domanda con risposta autonoma )

Per fare ciò è possibile creare la seguente funzione e inserirla in .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

La funzione crea una variabile utilizzata per determinare se il gruppo era precedentemente abilitato o meno.

Quando non è stato abilitato, il gruppo viene popolato con i comandi automatici desiderati. Se il gruppo era precedentemente abilitato, lo utilizziamo autocmd!per "ripristinarlo", ovvero eliminando il comando precedentemente inserito in esso.

Una documentazione pertinente è qui

Finalmente è possibile creare la seguente mappatura:

nnoremap <F4> :call ToggleTestAutoGroup()<CR>

da usare F4per chiamare la funzione.

EDIT : Karl Yngve Lervåg ha suggerito una versione migliorata di questa funzione che ha ridotto il numero di righe di codice, ho pensato che sarebbe stato bello mantenere entrambe le versioni che funzionano ancora, forse più facilmente da capire da un debuttante vimscript come me.

Ecco la funzione migliorata di Karl, molte grazie a lui:

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

In questa versione il gruppo viene sempre ripristinato e, se non è stato abilitato, viene popolato con i autocomandi desiderati


7

Trovo che il modo semplice sia usare una variabile globale. Esempio:

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>

Per ulteriori informazioni, consultare:

:h g:
:h get()
:h :if
:h :bar
:h line-continuation

Non sono sicuro di capire perché pensi che sia un modo semplice: non sono un maestro di vimscript, quindi la tua sintassi mi sembra un po 'complicata. Quali sono i pro del tuo metodo?
statox

Pro: 1) Nessuna funzione. 2) Può essere facilmente adattato per utilizzare un buffer / finestra variabili locali anziché una variabile globale. 3) Mappatura semplice
Peter Rincker,

Ok. Grazie per aver condiviso la tua soluzione non avrei pensato di farlo in questo modo!
statox
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.