Wie kann ich eine Augroup im laufenden Betrieb aktivieren / deaktivieren?


13

Ich habe eine augroupin meinem .vimrcInhalt erstellt autocmdund muss diese autocommandim laufenden Betrieb aktivieren / deaktivieren .

Die Idee ist, ein Mapping zu erstellen (sagen wir F4zum Beispiel), das diese Autobefehle aktiviert, wenn sie einmal gedrückt werden, und sie deaktiviert, wenn sie erneut gedrückt werden, ohne dass eine Datei erstellt oder neu geladen werden muss .vimrc.

Wie kann ich das machen?

Antworten:


17

Aufbauend auf Ihrer Antwort: Sie benötigen keine Variable, um den Status von zu erhalten augroup. Sie können dies verwenden exists(), vorausgesetzt, Sie kennen mindestens eines der autocmds, die Teil der Gruppe sind:

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>

Hey cooler Weg, es zu verbessern! Ich wusste nicht, dass du das kannst.
Statox

1
Sie können die Gruppe sogar in zwei Teile teilen und den elseZweig entfernen , indem Sie den autocmd!am Anfang bedingungslos ausführen.
VanLaser

@ VanLaser Könnten Sie? Haben Sie es so versucht? Hinweis: Was würde exists('#TestAutoGroup#BufEnter')nach einem zurückkehren autocmd!?
Sato Katsura

1
So etwas wie dies, vielleicht: pastebin.com/HEEYjseR
VanLaser

1
@VanLaser Und dann könnten Sie diese Operation zustandslos machen, indem Sie diese globale Variable entfernen. Vielleicht gibt es eine Funktion, die sich darum kümmern könnte. Diese Funktion muss möglicherweise ... Ow. Richtig. :)
Sato Katsura

9

(Ich habe es tatsächlich selbst herausgefunden, aber da ich auf dieser Website keine Antwort gefunden habe, dachte ich, dass dies nützlich sein könnte, um eine selbst beantwortete Frage zu erstellen. )

Dazu ist es möglich, die folgende Funktion zu erstellen und in Folgendes einzufügen .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

Die Funktion erstellt eine Variable, mit der bestimmt wird, ob die Gruppe zuvor aktiviert wurde oder nicht.

Wenn es nicht aktiviert war, wird die Gruppe mit den gewünschten Autobefehlen gefüllt. Wenn die Gruppe zuvor aktiviert war, verwenden wir sie autocmd!, um sie zurückzusetzen, dh den zuvor eingegebenen Befehl zu löschen.

Eine relevante Dokumentation finden Sie hier

Schließlich ist es möglich, die folgende Zuordnung zu erstellen:

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

verwenden F4, um die Funktion aufzurufen.

EDIT : Karl Yngve Lervåg schlug eine verbesserte Version dieser Funktion vor, die die Anzahl der Codezeilen reduzierte. Ich hielt es für gut, beide Versionen beizubehalten, wobei die erste noch funktioniert, was für einen Vimscript-Debütanten wie mich möglicherweise leichter zu verstehen ist.

Hier ist Karls verbesserte Funktion, vielen Dank an ihn:

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 dieser Version wird die Gruppe immer zurückgesetzt, und wenn sie nicht aktiviert wurde, wird sie mit den gewünschten Autobefehlen gefüllt


7

Ich finde, der einfache Weg ist, eine globale Variable zu verwenden. Beispiel:

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>

Weitere Hilfe finden Sie unter:

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

Ich bin mir nicht sicher, warum Sie denken, dass dies ein einfacher Weg ist: Ich bin kein Vimscript-Meister, daher scheint mir Ihre Syntax ein wenig zu kompliziert zu sein. Was sind die Vorteile Ihrer Methode?
Statox

Vorteile: 1) Keine Funktion. 2) Kann leicht angepasst werden, um lokale Puffer- / Fenstervariablen anstelle einer globalen Variablen zu verwenden. 3) Einfache Zuordnung
Peter Rincker

In Ordnung. Vielen Dank, dass Sie Ihre Lösung geteilt haben. Ich hätte nicht gedacht, dies so zu tun!
Statox
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.