Bagaimana cara mengaktifkan / menonaktifkan augroup on the fly?


13

Saya membuat beberapa augroupdi saya .vimrcmengandung autocmddan saya harus mengaktifkan / menonaktifkan ini autocommanddengan cepat.

Idenya adalah untuk membuat pemetaan (katakanlah F4misalnya) yang akan mengaktifkan perintah otomatis ini ketika ditekan sekali dan menonaktifkannya ketika ditekan lagi tanpa harus sumber file atau memuat ulang .vimrc.

Bagaimana saya bisa melakukan itu?

Jawaban:


17

Membangun jawaban Anda: Anda tidak perlu variabel untuk menjaga keadaan augroup, Anda dapat menggunakan exists()untuk itu, asalkan Anda tahu setidaknya satu dari autocmds yang merupakan bagian dari grup:

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>

Hai cara keren untuk memperbaikinya! Saya tidak tahu Anda bisa melakukan itu.
statox

1
Anda bahkan dapat membagi grup menjadi 2 bagian dan menghapus elsecabang, dengan menjalankan autocmd!tanpa syarat di awal.
VanLaser

@ VanLaser Bisakah Anda? Sudahkah Anda mencoba melakukannya dengan cara itu? Petunjuk: apa yang akan exists('#TestAutoGroup#BufEnter')kembali setelah suatu autocmd!?
Sato Katsura

1
Sesuatu seperti ini, mungkin: pastebin.com/HEEYjseR
VanLaser

1
@ VanLaser Dan kemudian Anda bisa membuat operasi itu tanpa kewarganegaraan, dengan menyingkirkan variabel global itu. Mungkin ada fungsi yang bisa mengatasi itu. Fungsi itu mungkin perlu ... Ow. Baik. :)
Sato Katsura

9

(Saya benar-benar menemukan jawabannya sendiri tetapi karena saya tidak menemukan jawaban di situs ini, saya pikir itu bisa berguna untuk membuat pertanyaan yang dijawab sendiri )

Untuk melakukannya dimungkinkan untuk membuat fungsi berikut dan meletakkannya di .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

Fungsi membuat variabel yang digunakan untuk menentukan apakah grup itu sebelumnya diaktifkan atau tidak.

Ketika tidak diaktifkan, grup tersebut diisi dengan perintah otomatis yang diinginkan. Jika grup sebelumnya diaktifkan, kami menggunakan autocmd!"reset" yaitu menghapus perintah yang sebelumnya dimasukkan di dalamnya.

Dokumentasi yang relevan ada di sini

Akhirnya dimungkinkan untuk membuat pemetaan berikut:

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

digunakan F4untuk memanggil fungsi.

EDIT : Karl Yngve Lervåg menyarankan versi yang ditingkatkan dari fungsi ini yang mengurangi jumlah baris kode, saya merasa akan lebih baik untuk menjaga kedua versi yang pertama tetap berfungsi mungkin lebih mudah dimengerti oleh debutan vimcript seperti saya.

Inilah fungsi Karl yang ditingkatkan, terima kasih banyak padanya:

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

Dalam versi ini grup ini selalu diatur ulang, dan jika tidak diaktifkan, ia diisi dengan perintah otomatis yang diinginkan


7

Saya menemukan cara mudah adalah dengan menggunakan variabel global. Contoh:

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>

Untuk bantuan lebih lanjut lihat:

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

Saya tidak yakin untuk memahami mengapa Anda berpikir ini adalah cara yang mudah: Saya bukan master vimscript sehingga sintaks Anda tampaknya sedikit rumit bagi saya. Apa kelebihan metode Anda?
statox

Pro: 1) Tidak ada fungsi. 2) Dapat dengan mudah diadaptasi untuk menggunakan buffer / jendela variabel lokal, bukan variabel global. 3) Pemetaan sederhana
Peter Rincker

Baik. Terima kasih telah membagikan solusi Anda, saya tidak akan berpikir untuk melakukannya dengan cara ini!
statox
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.