Bir augroup'u anında nasıl etkinleştirir / devre dışı bırakır?


13

Bir oluşturulan augroupbenim de .vimrciçeren çeşitli autocmdve G / etkinleştirmek için şu devre dışı bırakmanız gerekir autocommandanında.

Buradaki fikir, bir F4kez basıldığında bu otomatik komutları etkinleştirecek ve bir dosyayı kaynaklamak veya yeniden yüklemek zorunda kalmadan tekrar basıldığında bunları devre dışı bırakacak bir eşleme ( örneğin diyelim ) oluşturmaktır .vimrc.

Bunu nasıl yapabilirim?

Yanıtlar:


17

Cevabınızı temel alarak: Grubun parçası olan en az bir tanesini bilmeniz koşuluyla, bunun için augroupkullanabileceğiniz bir değişkene ihtiyacınız yoktur :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>

Hey geliştirmek için harika bir yol! Bunu yapabileceğini bilmiyordum.
statox

1
Hatta başlangıçta koşulsuz olarak çalışarak grubu 2 parçaya bölebilir ve elsedalı çıkarabilirsiniz autocmd!.
VanLaser

@VanLaser Yapabilir misiniz? Bunu böyle denedin mi? İpucu: exists('#TestAutoGroup#BufEnter')sonra ne dönecekti autocmd!?
Sato Katsura

1
Bunun gibi bir şey, belki: pastebin.com/HEEYjseR
VanLaser

1
@VanLaser Ve sonra o küresel değişkenden kurtularak o işlemi durumsuz hale getirebilirsiniz. Belki de bununla ilgilenebilecek bir işlev vardır. Bu işlevin ... Ow. Sağ. :)
Sato Katsura

9

(Aslında kendim anladım ama bu sitede bir cevap bulamadığım için bunun kendinden cevaplı bir soru oluşturmak için yararlı olabileceğini düşündüm )

Bunu yapmak için aşağıdaki işlevi oluşturmak ve içine koymak mümkündür .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

İşlev, grubun önceden etkinleştirilip etkinleştirilmediğini belirlemek için kullanılan bir değişken oluşturur.

Etkinleştirilmediğinde, grup istenen otomatik komutlarla doldurulur. Grup daha önce etkinleştirildiyse, bunu autocmd!"sıfırlamak" için kullanırız , yani daha önce girilmiş olan komutu silmek.

İlgili bir dokümantasyon burada

Son olarak, aşağıdaki haritalamayı oluşturmak mümkündür:

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

F4işlevi çağırmak için kullanın .

DÜZENLEME : Karl Yngve Lervåg kod satır sayısını azaltan bu işlevin geliştirilmiş bir sürümünü önerdi , her iki sürümü de hala benim gibi bir vimscript debutant tarafından anlaşılması daha kolay çalışan her iki sürümü tutmak iyi olacağını hissettim.

İşte Karl'ın iyileştirilmiş işlevi, çok teşekkürler:

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

Bu sürümde grup her zaman sıfırlanır ve etkinleştirilmemişse, istenen otomatik komutlar ile doldurulur.


7

Kolay bir yolun global bir değişken kullanmak olduğunu düşünüyorum. Misal:

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>

Daha fazla yardım için bkz:

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

Neden kolay bir yol olduğunu düşündüğünüzü anlayamıyorum: Bir vimscript ustası değilim, bu yüzden sözdizimim bana biraz karmaşık geliyor. Sizin yöntemin avantajları nelerdir?
statox

Artıları: 1) İşlev yok. 2) Küresel değişken yerine tampon / pencere yerel değişkenlerini kullanmak için kolayca uyarlanabilir. 3) Basit haritalama
Peter Rincker

Tamam. Çözümünüzü paylaştığınız için teşekkür ederim, bu şekilde yapmayı düşünmezdim!
statox
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.