その場でaugroupを有効/無効にする方法は?


13

augroup.vimrcはいくつかのautocmdを含むを作成しましたがautocommand、オンザフライで有効/無効にする必要があります。

アイデアは、F4一度押すとこれらのオートコマンドを有効にし、もう一度押すとファイルをソースしたり、を再ロードしたりすることなく無効にするマッピング(たとえば、としましょう)を作成すること.vimrcです。

どうやってやるの?

回答:


17

あなたの答えに構築:あなたはの状態を維持するための変数を必要としないaugroup、あなたが使用することができexists()ますが、少なくとも1知っていることを提供し、そのためにautocmdグループの一部である(S)

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実行することで、グループを2つに分割してブランチを削除することもできautocmd!ます。
VanLaser

@VanLaserいただけますか?そのようにしてみましたか?ヒント:のexists('#TestAutoGroup#BufEnter')後に何が返されautocmd!ますか?
佐藤桂

1
このような何か、多分:pastebin.com/HEEYjseR
VanLaser

1
@VanLaserそして、そのグローバル変数を取り除くことによって、その操作をステートレスにすることができます。おそらくそれを処理できる関数があるでしょう。その関数は次のことを行う必要があるかもしれません...わぁ。正しい。:)
佐藤桂

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は、コードの行数を削減するこの関数の改良版を提案しました。私は、両方のバージョンを引き続き機能させておくとよいと感じました。

ここにカールの改良された機能があります、彼に感謝します:

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のマスターではないため、構文が少し複雑すぎるようです。あなたの方法の長所は何ですか?
スタトックス

長所:1)機能なし。2)グローバル変数の代わりにバッファ/ウィンドウローカル変数を使用するように簡単に調整できます。3)簡単なマッピング
Peter Rincker、2015

OK。あなたの解決策を共有してくれてありがとうございます。
statox
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.