디스크에서 파일이 변경 되 자마자 VIM에서 파일 자동 재로드


32

파일에 VIM 버퍼에 저장되지 않은 변경 사항이 없다고 가정하면 파일이 디스크에서 변경되면 자동으로 다시로드하고 싶습니다. 가장 자주 사용되는 사례는 파일이있는 작업 복사본을 업데이트 할 때입니다.

어떻게하면 되나요?


나는 이것이 당신이 의미하는 것이라고 생각하지만, 나의 구체적인 유스 케이스는 다른 자식 분기 또는 커밋을 체크 아웃 할 때 vim이 파일을 다시로드하기를 원합니다.
Nathan Long

답변:


32

당신의 ~/.vimrc:

set autoread

9
일반적으로 autoread외부 명령을 실행 한 후에 만 ​​트리거됩니다. 이 답변 은 솔루션에 대해 자세히 설명합니다.
Tom Hale

작동하지 않습니다. 자세한 답변은 @TomHale 링크를 참조하십시오.
JonnyRaa

11

이것이 나를 위해 일한 것입니다

set autoread                                                                                                                                                                                    
au CursorHold * checktime  

첫 번째 줄만으로는 충분하지 않았습니다. 당신은 당신을 넣을 수 있습니다.vimrc

Phan Hai Quang의 신용


autocmd는 필요하지 않습니다. CursorHold 이벤트가 트리거되는 동시에 검사 시간이 내부적으로 실행되어야합니다. 다시 말해, Vim이 두 번째 점검 시간을하게 만드는 것입니다.
Heptite

나를 위해 필요합니다. 많은 연구 끝에 찾은 최고의 솔루션. @ Heptite, 당신은 당신의 주장에 대한 장과 구절이 있습니까?
Tom Hale

1
@TomHale Vim 문서를 검토 한 결과, 내가 말할 수있는 한 명시 적으로 말하지는 않지만 " :help timestamp"는 내가 실수 한 사람임을 나타내며 Vim은 특정 이벤트에 대해서만 검사를 수행합니다. 따라서 autocmd가 더 자주 점검되도록해야 할 수도 있습니다.
Heptite

5

자동 읽기가 제대로 작동하지 않습니다. 다음은 나를 위해 작동합니다.

먼저 여기 에서 스크립트를 설치해야합니다 .

설정 기능을 직접 호출하여 최상의 결과를 얻었습니다.

let autoreadargs={'autoread':1} 
execute WatchForChanges("*",autoreadargs) 

그 이유는 ipython / screen / vim 설정을 실행하고 싶어하기 때문입니다.

이를 향상된 버전의보기로 쉽게 변환 할 수 있습니다.

프로세스를 스크립트하십시오.

mkdir -p ~/bin
cat <<`OUT` > ~/bin/vimviewer
#!/usr/bin/env sh
exec vim -n --cmd "source /home/bryan/.vim/.vimrc.watchforchanges | let autoreadargs={'autoread':1} | execute WatchForChanges('*',autoreadargs)" $@
`OUT`

chmod 755 ~/bin/vimviewer
vimview test.txt

1
gVim 또는 MacVim과 같은 vim GUI 중 하나를 사용하는 경우 자동 읽기 명령이 나머지 환경과 잘 통합됩니다. 예를 들어 다른 프로그램, 다른 편집기 또는 소스 제어에서 파일을 편집 한 다음 vim으로 다시 전환하면 업데이트 된 파일이 자동으로 읽 힙니다. 문제는 vim의 터미널 버전이 어떻게 통합되는지에 관한 것 같습니다. GUI에서 또는 tmux와 같은 터미널 멀티플렉서를 사용하여 프로그램간에 전환 할 때 터미널 버전에서 알 수 없으므로 관련 시간에 자동 읽기가 실패합니다. vim이 관련 파일 시스템 이벤트를 구독하면 좋을 것입니다.
bames53

3

vim-autoread 플러그인은 지금까지 나를 위해 일했습니다.

vim-autoread

vim이 디스크에 기록되었지만 vim에서 마지막으로 쓴 이후 버퍼에서 수정되지 않은 파일을 자동으로 다시로드합니다. 이를 통해 vim에서 열린 파일을 다른 응용 프로그램을 사용하여 편집하고 저장할 수 있습니다. vim으로 돌아 오면 마지막 변경 이후 파일을 수정하지 않은 한 : e를 수동으로 누른 것처럼 디스크의 변경 사항을 반영하도록 파일이 자동으로 업데이트됩니다.


이 링크가 질문에 대한 답변을 제공 할 수 있지만 여기에 답변의 필수 부분을 포함시키고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않을 수 있습니다. - 리뷰에서
Burgi

@ Burgi 나는 문제를 해결하는 방법을 설명하는 플러그인 설명을 추가했습니다.
Wojtek Kruszewski

나는 그것을 시도했지만 j효과적인 업데이트를 보려면 탐색 명령 (예 :)을 입력해야합니다 . 나는이 여기에 대해 문제를 만들어 : github.com/djoshea/vim-autoread/issues/3
마틴 Delille

3

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

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

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

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


lh커서가 줄의 마지막 위치에 있으면 아무 것도 수행하지 않고 위치 lh가 변경됩니다.
Mahmoud Al-Qudsi

바로 그 점입니다. 최소한의 상호 작용 또는 파일 변경으로 파일이 다시로드됩니다. 원하는 경우 마지막 줄이나 첫 번째 줄로 건너 뛸 수 있지만 (lh를 gg 또는 G로 바꾸십시오) 여기서 목표는 vim에서 파일을 다시로드하는 것입니다. 여기서 무엇을하고 싶습니까?
eli

@ MahmoudAl-Qudsi ... 의미 "LH는"단지 CURSORHOLD 트리거합니다 - 다시 autoread를 트리거 동작 (I은 설명에서 그 언급)
일라이

1

Vim 버전에 따라 작동 할 수 있는 플러그인이 여기 에 있습니다.

또 다른 방법은 checktime외부 프로세스에서 정기적으로 vim에 명령을 보내는 것입니다. 이 작업을 수행하는 ShellJS 스크립트가 있습니다 ( shelljs-plugin-sleep, NeoVim 및 nvr).

while (true) {
  sleep(15);
  var servernames = exec('nvr --serverlist').trim().split('\n');
  if (!servernames.length || !servernames[0]) {
    continue;
  }
  servernames.forEach(
    (sn) => exec(`nvr -c "checktime" --servername ${sn}`) );
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.