2011-12-23 3 views
3

내 플러그인에 BufWritePost에 대한 autocmd가 있습니다. (이 자동 명령의 전체 프로젝트 태그를 업데이트하면이 플러그인은 Indexer.tar.gz입니다.)여러 파일을 저장 한 후 한 번만 실행되는 자동 명령

가끔은 많은 파일을 저장해야합니다 ("wa"). 물론, 각 파일 저장에 대한 autocmd가 필요합니다.

나는 ALL filesave 바로 뒤에 전화를 걸고 싶습니다. 말하자면, 내가 20 개의 저장되지 않은 버퍼를 가지고 있다면 : wa, 그리고 내 autocmd는 마지막 버퍼가 저장된 후에 단 한번 호출된다. 할 방법이 있습니까?

사실이 플러그인은 충분히 똑똑하기 때문에 가능한 경우 백그라운드에서 ctags를 시작하지만 어쨌든 이것은 약간 짜증납니다.

+0

autocmd로 무엇을하려고하는지 설명해 주시겠습니까? 일반적으로? – Rook

+0

@ldigas, 나는 이미 다음과 같이 썼다.이 자동 명령에서 전체 프로젝트의 태그를 업데이트한다. 이것은 Indexer.tar.gz 플러그인이다. 사용자가 파일을 저장할 때 내 플러그인은 태그를 항상 최신 상태로 유지하기 위해 전체 프로젝트에 대해 ctags를 실행합니다. –

답변

1

한 자동 명령이없는 방법 : (콜론없이) 정상 모드에서

function! MyFunction() 
    "" Save all buffers. 
    bufdo wa 
    "" Run your command once. 
    ... your command ... 
endfunction 

nnoremap ,wa :call MyFunction()<CR> 

밀어 ,wa하고 모든 버퍼가 저장되고 나중에는 당신의 명령을 실행합니다.

편집 :

function! MyFunction() 
    "" Save number of current buffer. 
    let l:current_buffer = bufnr("%") 

    "" Save all buffers. 
    bufdo wa 

    "" Bufdo probably changed the buffer, so return to where we were before running previous command. 
    execute "buffer " . l:current_buffer 

    "" Run your command once. 
    ... your command ... 
endfunction 
+0

고마워,하지만 표준을 만들기위한 솔루션을 찾고 있는데 : wa work, 내 플러그인의 다른 사용자가 사용하기 쉽게 만든다. 사실 이것은 cmdalias (http://goo.gl/8W6VD) 플러그인을 사용하고 override : wa 명령을 사용하는 변형이지만 너무 까다로운 것 같습니다. 더 자연스러운 방법을 찾고 있습니다. –

0

는 사용자가에 대한 키를 누르지 않을 때, 즉 "을 트리거이 CursorHold 이벤트가 : bufdo가 변경되기 때문에, 이전의 버퍼에 반환하는 함수를 수정 'updatetime'으로 지정된 시간 " (기본값은 4 초). 이 이벤트는 사용자가 입력을 계속하지 않는 한 파일을 저장 한 후 updatetime 밀리 초 후에 트리거됩니다. BufWrite 자동 명령을 사용하면 임시로이 설정 시간을 매우 낮게 설정할 수 있습니다 (예 : 50ms). CursorHold에 자동 실행 자동 명령을 추가 할 수 있습니다. BufWrite 자동 명령은 이번에 CursorHold 처리기를 이미 구성했는지 확인하여 여러 번 추가하지 않도록 할 수 있습니다.

다소 유연하게 만들기 위해이 컨스트럭션을 사용자 지정() 이벤트로 만듭니다. 첫 번째 저장이 감지되면 "일괄 저장"의 각 파일에 대해 그리고 마지막으로 시간 초과가 발생할 때 마지막으로 이벤트가 발생합니다. 이 방법으로 다른 스크립트는 이러한 이벤트를 독립적으로 처리 할 수 ​​있습니다.

구현 :

function! s:WriteTimeoutSchedule() 
    if !exists("#WriteTimeout#CursorHold") 
    let s:oldUpdateTime = &ut 
    set updatetime=50 
    augroup WriteTimeout 
     au CursorHold * call s:WriteTimeoutFire() 
    augroup END 
    do User WriteTimeoutPre 
    endif 
    do User WriteTimeoutEach 
endfunction 

function! s:WriteTimeoutFire() 
    do User WriteTimeoutPost 
    au! WriteTimeout 
    let &ut=s:oldUpdateTime 
endfunction 

aug WriteTimeoutSupport 
    au! 
    au BufWrite * call s:WriteTimeoutSchedule() 
aug END 

사용 예 : toucher.vim.

관련 문제