augroup을 즉시 활성화 / 비활성화하는 방법은 무엇입니까?


13

나는를 만들어 augroup내에 .vimrc포함 된 여러 autocmd나는 / 사용이 비활성화 할 필요가 autocommand즉석에서.

아이디어는 F4한 번 누르면 이러한 자동 명령을 활성화하고 파일을 소싱하거나을 다시로드하지 않고 다시 누르면 다시 비활성화 하는 매핑 ( 예를 들어)을 만드는 것 .vimrc입니다.

어떻게해야합니까?

답변:


17

답을 바탕으로 :의 상태를 유지하기 위해 변수가 필요하지 않습니다 . 그룹에 속한 적어도 하나를 알고 augroup있다면 사용할 수 있습니다 .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>

그것을 개선하는 멋진 방법! 당신이 할 수있는 줄 몰랐어요
statox

1
처음에 무조건 else실행하여 그룹을 두 부분으로 나누고 분기를 제거 할 수도 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 Yngve Lervåg 는이 기능 의 개선 된 버전 을 제안하여 코드 줄 수를 줄였습니다. 두 버전을 계속 유지하는 것이 좋을 것이라고 생각했습니다.

Karl의 개선 된 기능은 다음과 같습니다.

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 마스터가 아니기 때문에 구문이 약간 복잡해 보입니다. 당신의 방법의 장점은 무엇입니까?
statox

장점 : 1) 기능이 없습니다. 2) 전역 변수 대신 버퍼 / 창 로컬 변수를 사용하도록 쉽게 조정할 수 있습니다. 3) 간단한 매핑
Peter Rincker

확인. 이런 식으로 생각하지 않은 솔루션을 공유해 주셔서 감사합니다!
statox
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.