vi (m)에서 열린 파일의 변경된 내용 새로 고침


362

vim에서 열어 둔 구성 파일이 있지만 때로는 변경 사항이 터미널에 반영되지 않고 디스크에서 변경됩니다. 파일을 닫았다가 다시 열지 않고 화면의 내용을 새로 고칠 수 있습니까? 그렇다면 어떻게?



마무리 : 지금까지의 모든 답변은 "푸시"스타일 대신 "폴"입니다. 즉, 다른 소프트웨어와 유사한 기능으로 수행 된 것처럼 외부 파일 변경 이벤트를 수신하는 대신 이러한 응답은 수동으로 또는 사용자 작업 또는 타이머에 의해 트리거 된 파일 변경을 적극적으로 폴링하는 vim에 의존합니다. 결과적으로 화면에 변경 사항이 즉시 새로 고쳐지지 않습니다.
Penghe Geng

답변:


464

:edit파일 이름을 지정하지 않고 명령을 사용 하여 현재 파일을 다시로드 할 수 있습니다. 파일을 수정 :edit!한 경우 현재 파일을 강제로 다시로드 하는 데 사용할 수 있습니다 (수정 내용이 손실 됨).

이 명령 :edit은로 축약 될 수 있습니다 :e. 따라서 강제 편집은 다음과 같이 수행 할 수 있습니다.:e!


2
"!" 나에게 걸려 넘어졌지만 지금은 분명합니다.
twan163

107
참고 : 일반적으로로 축약됩니다 :e!.
Stéphane Chazelas

31
@StephaneChazelas :하는 대신 : 네, 맞습니다 :)의 @의 twan163이야 :edit하고 :edit!사용할 수 :e:e!각각.
Thushi

11
수정 사항을 잃어 버립니다. 결정적으로, 당신은 여전히 undo 할 수 있습니다 :e!.
gerrit

5
또한 모든 버퍼를 다시로드하려면 다음을 실행하십시오.:bufdo e
pkout

193

수동으로 파일을 새로 고침 할뿐만 아니라 :edit, 당신은 넣어 수 있습니다~/.vimrc

:set autoread

Vim이 편집하지 않은 파일을 Vim이 자동으로 새로 고치도록합니다. 도 참조하십시오 :checktime.


2
구매자주의-새로운 코드로 작업 git pull중이고 저장하지 않은 변경 사항은 화면에서 의도하지 않게 손실 될 수 있습니다.
azatar

5
@toszter 아니요, Vim은 변경되지 않은 버퍼 만 새로 고칩니다 . 변경의 경우에도 쿼리가 유지됩니다. 유지 또는로드 하시겠습니까?
Ingo Karkat

10
NB 자동 읽기 자동으로 작동하지 않습니다 . 을 사용 gvim하거나 외부 명령을 실행해야합니다.
Sparhawk

3
TMUX의 내부에 정력을 사용하는 사람들은 사용하여 포커스 이벤트를 얻을 수 github.com/tmux-plugins/vim-tmux-focus-events을 . 그렇지 않으면 당신이 어떤 식 으로든 전화하지 않으면 자동 읽기가 터미널에서 도움이되지 않습니다:checktime
Karl Bartel

3
autoread커서의 움직임 멈추고 X 초 후에 자동 트리거 될 수 있습니다 ( 이 답변 참조) .
Tom Hale

57

TL; DR

삶의 질을 높이기 위해 추가 할 줄 Wrap-up제목으로 건너 뜁니다 vimrc.

수동으로

운영 :checktime

Vim 외부에서 버퍼가 변경되었는지 확인하십시오. 파일의 두 가지 버전으로 끝나는지를 확인하고 경고합니다.

자동으로

변경 사항을 자동으로로드하려면 다음을 추가하십시오 vimrc.

set autoread

파일이 Vim 외부에서 변경된 것으로 감지되어 Vim 내부에서 변경되지 않은 경우 자동으로 다시 읽습니다. 파일이 삭제되면 수행되지 않습니다.

이 답변 은주의 사항을 추가합니다.

외부 명령 실행 (예 !ls: !sh등) 을 수행하지 않으면 자동 읽기가 파일을 다시로드하지 않습니다.

솔루션을 읽으십시오.

커서가 움직이지 않을 때 트리거

에 추가 vimrc:

au CursorHold,CursorHoldI * checktime

기본적으로 CursorHold 는 커서가 4 초 동안 정지 한 후에 트리거되며 updatetime을 통해 구성 할 수 있습니다 .

버퍼 변경 또는 터미널 포커스에서 트리거

vim 내부에서 버퍼를 변경할 때 vimrc트리거 하려면 다음을 추가하십시오 .autoread

au FocusGained,BufEnter * :checktime

일반 Vim 내부에서 터미널 창 초점 잡기

FocusGained터미널 에뮬레이터 (Xterm, tmux 등) 내에서 일반 vim에서 작동하도록 하려면 (위 참조) vim-tmux-focus-events 플러그인을 설치하십시오.

tmux 버전> 1.9에서는 다음을 추가해야합니다 .tmux.conf.

set -g focus-events on

마무리

autoread트리거가 가능한 경우에도 알림 .

vimrc위의 모든 내용을 구현하는 줄 은 다음과 같습니다 .

" Triger `autoread` when files changes on disk
" https://unix.stackexchange.com/questions/149209/refresh-changed-content-of-file-opened-in-vim/383044#383044
" https://vi.stackexchange.com/questions/13692/prevent-focusgained-autocmd-running-in-command-line-editing-mode
autocmd FocusGained,BufEnter,CursorHold,CursorHoldI * if mode() != 'c' | checktime | endif
" Notification after file change
" https://vi.stackexchange.com/questions/13091/autocmd-event-for-autoread
autocmd FileChangedShellPost *
  \ echohl WarningMsg | echo "File changed on disk. Buffer reloaded." | echohl None

와 함께 올바른 방향으로 나를 가리켜 준 ErichBSchulz에게au CursorHold 감사합니다 .


2
훌륭한 포스트! 이것이 기본 행동이어야하는 것들 중 하나 인 것 같습니다
JonnyRaa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.