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()
후
실제로 더 많은 방법이 있습니다. 예를 들어 entr
Python inotify
또는 gamin
모듈 과 같은 도구를 사용하여
파일 변경 사항을 모니터링하고 :checktime
모든 버퍼에 인수가없는 경우 모든 버퍼를 확인합니다. 이는 단일 버퍼 만 확인하여 향상시킬 수 있습니다. 특정 파일.
그러나이 대답은 이미 다소 길다 :-) 이러한 방법은 대부분의 시나리오에서 잘 작동하거나 시나리오에 쉽게 적용 할 수 있어야합니다.
추신. 루비를 사용하려고했지만 불행히도 루비 스레드 ()를 사용하여 Thread
파이썬처럼 백그라운드에서 실행되지 않으므로이 작업을 수행 할 수 없었습니다 (아마도 다른 방법이 있습니까?)
CursorHold
이벤트는 어떻습니까? Vim에 포커스가 없으면 n 초마다 트리거됩니다.