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.