포커스가없는 상태에서 Vim이 파일을 자동 읽기하도록하려면 어떻게해야합니까?


29

파일에 쓰여진 출력을 모니터링하는 것을 포함하여 모든 종류의 (또는이 경우에는 gVim)에 VIm을 사용하고 있습니다. 내가 사용하는 autoreadVim은 내가 여기에 키보드 포커스를 전환 할 때마다가하는 파일을 다시 읽을 수 있도록.

키보드 포커스를 전환하지 않아도 Vim에서 버퍼를 업데이트하는 방법이 있습니까? 설정을 시도 checktime했지만 키보드 포커스가 다른 곳에서는 효과가 나타나지 않습니다.

모니터링하고있는 출력은 출력 파일을 완전히 대체합니다. 나는 그것을 찾지 않습니다 tail -f. 매번 새로운 인스턴스에 배관 less하거나 다른 것에 배관하는 것과 같은 다른 옵션이 있지만 VIm으로 수행 할 수 있다면 멋지다.


@Carpetsmoker CursorHold이벤트는 어떻습니까? Vim에 포커스가 없으면 n 초마다 트리거됩니다.
muru

1
@muru 아니요, CursorHold한 번만 실행되며, 명시 적으로 문서화됩니다. "Vim이 커피를 만들기 위해 떠날 경우 '업데이트 시간'ms마다 실행되지 않습니다. :)"
Martin Tournoij

1
나는 제거 gvim을의 나는이 질문이, 괜찮아요 ;-) 내가보기로 희망을, 다시 태그를 하지 정말 대해 , 포커스 변경이 파일이 변경되는 경우 빔 검사가 (전체 무리가있는 하나의 이벤트가있는 한, GVIM 자세한 내용은 내 답변을 참조하십시오). 전부는 아니더라도, 이것을 개선하는 대부분의 방법은 Vim과 gVim에서 잘 작동합니다.
Martin Tournoij

@ Carpetsmoker 아, 키보드 포커스가있는 동안 gVim이 정기적으로 확인하는 느낌을 받았습니다 (그래서 gVim 질문으로 생각합니다). 정리해 주셔서 감사합니다.
falstro

답변:


20

2015-06-25 업데이트 :

  • "쉘"방법이 제대로 작동하지 않아 폐기했습니다. 삽입 모드를 중단하고 좀비 프로세스를 종료했습니다. 봐 ,이 게시물의 개정 역사 당신이 정말로 어쨌든 그것을보고 싶어합니다.
  • auto_autoread.vim 에서 플러그인을 만들었습니다 . 현재 아래 코드와 사실상 동일하지만 업데이트를받을 가능성이 있으므로 플러그인을 사용하는 것이 좋습니다.

무엇을 autoread합니까?

이 질문에 답하기 위해서는 먼저 autoread옵션이 무엇을하는지, 무엇보다 중요 하지 않은 것을 이해해야합니다 .

불행히도 :help 'autoread' 이것에 대한 많은 정보는 없지만 "파일이 Vim 외부에서 변경된 것으로 감지되었습니다" 라고 말합니다 . Vim은 파일이 변경되었음을 어떻게 감지합니까? 특정 작업에서 Vim은 파일의 수정 시간을 확인합니다.

언제:

  • :checktime 사용;
  • 버퍼가 입력된다;
  • :diffupdate 사용;
  • :e 이미 버퍼가있는 파일에 대해 발행되었습니다.
  • !; 로 외부 명령을 실행
  • 포 그라운드로 리턴 ( ^Z, fg쉘에 작업 제어가있는 경우에만);

gVim의 경우 다음과 같은 경우에도 수행됩니다.

  • "마우스 오른쪽 버튼 클릭"메뉴 닫기 (무엇을 선택하거나 닫음)
  • 초점이 변경되었습니다 (이것은 이미 주목 한 것입니다).
  • 메뉴에서 "파일-> 열기", "파일-> 다른 이름으로 저장"을 사용하는 경우 팝업되는 파일 브라우저 대화 상자를 닫습니다 (일부 다른 위치).

로 설정된 buf_check_timestamp(), check_timestamps()함수 및 위치 에 대한 모든 호출을 찾아 Vim 소스에서이 정보를 수집 need_check_timestamps했습니다 TRUE.

몇 가지 이벤트를 놓쳤을 수도 있지만 Vim은 파일이 매우 제한된 상황에서 수정되었는지 확인합니다 . 확실히 n 초 동안 변경 사항에 대해 파일을 "폴링"하지 않습니다 . 기본적으로 당신이 따르는 것입니다.

따라서 귀하의 목적으로 set autoread는 충분하지 않습니다.

파이썬 사용하기

이것은 파이썬 스레드가 백그라운드에서 실행되도록 예약하며 n:checktime마다 실행 됩니다 . 가 활성화 된 경우 디스크에서 버퍼를 다시로드합니다. 그렇지 않으면 경고 만 표시됩니다.autoread

이 빔은 가지고 있어야 +python또는 +python3에서 :version. 모든 플랫폼 (Windows 포함)에서 작동해야합니다.

fun! AutoreadPython()
python << EOF
import time, vim
try: import thread
except ImportError: import _thread as thread # Py3

def autoread():
    vim.command('checktime')  # Run the 'checktime' command
    vim.command('redraw')     # Actually update the display

def autoread_loop():
    while True:
        time.sleep(1)
        autoread()

thread.start_new_thread(autoread_loop, ())
EOF
endfun

:call AutoreadPython(); 를 사용하여 시작할 수 있습니다 . 물론 autocmd에서이 작업을 수행 할 수 있습니다. 예를 들면 다음과 같습니다.

autocmd *.c call AutoreadPython()

실제로 더 많은 방법이 있습니다. 예를 들어 entrPython inotify또는 gamin모듈 과 같은 도구를 사용하여 파일 변경 사항을 모니터링하고 :checktime모든 버퍼에 인수가없는 경우 모든 버퍼를 확인합니다. 이는 단일 버퍼 만 확인하여 향상시킬 수 있습니다. 특정 파일.
그러나이 대답은 이미 다소 길다 :-) 이러한 방법은 대부분의 시나리오에서 잘 작동하거나 시나리오에 쉽게 적용 할 수 있어야합니다.

추신. 루비를 사용하려고했지만 불행히도 루비 스레드 ()를 사용하여 Thread파이썬처럼 백그라운드에서 실행되지 않으므로이 작업을 수행 할 수 없었습니다 (아마도 다른 방법이 있습니까?)


2

백그라운드에서 버퍼를 비동기식으로 업데이트 하는 데 사용 하는 작은 플러그인 vim-autoread 를 만들었습니다 tail -f. 이것은 분명히 Vim 버전 8의 작업 기능이 필요합니다.

:AutoRead켜거나 끌 때 사용하십시오 :AutoRead!.


NeoVim 호환 버전이 좋습니다!
앤드류

@AndrewMacFie 모르겠는데 왜 Neovim에서 작동하지 않을까요?
Christian Brabandt '

NeoVim에서 Vim 8 작업 지원이 부족하다고 생각합니까?
Andrew

@AndrewMacFie 아, 아마 사실 일 것입니다. neovim을 사용하지 않기 때문에 NeoVim과 호환되지 않습니다. 그러나 PR은 환영받을 것이다 :)
Christian Brabandt

공정 충분히
앤드류

1

Neovim에서는 다음 명령을 사용하여 tail 명령을 실행하는 터미널 버퍼를 열 수 있습니다.

:enew | call termopen('tail --follow=name --retry /path/to/file.log')

파일을 제거하고 다시 작성하더라도 계속 작동합니다.

또는 다음에 추가하십시오 $MYVIMRC

" :Tail /path/to/file
function! Tail(file)
  enew
  call termopen('tail --follow=name --retry ' . fnameescape(a:file))
endfunction
command! -nargs=1 Tail call Tail(<f-args>)

1

답변에서 ( PhanHaiQuang 의 답변 과 flukus 의 의견 참조 )

필요할 때 ex (whithin vim) 에서이 oneliner를 실행할 수 있습니다 (또는 로그 파일을 열 때 vimrc에 각 명령을 넣습니다).

:set autoread | au CursorHold * checktime | call feedkeys("lh")

설명 :
- autoread은 : 더 내부 타이머 또는 그런 일이없는, 외부에서 변경된 파일을 읽고 (하지만 자신의 작업을 나던 그것은 단지 정력이 예에서 명령과 같은 작업을 수행하는 파일을 읽습니다. :!
- CURSORHOLD * checktime : 커서가 checktime가 실행된다 (4000 기본적으로 밀리 초입니다) 'updatetime'파일 외부에서 변경 검사에 지정된 시간 동안 사용자에 의해 이동되지 않을 때
- 통화 feedkeys ( "LH") : 커서 (우리가 의미하는 CURSORHOLD가 트리거 될 것을 ...하는 수단 권리, 한 번 이동하고 다시 왼쪽 후 아무 일도 발생하지 않습니다. 루프 )

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.