현재 파일을 어떻게 다시로드합니까?


145

종종 버전 제어되는 파일로 작업하고 있으므로 Vim 외부에서 파일을 변경할 수 있습니다.

Vim을 닫았다가 다시 열지 않고도 파일을 빠르게 다시로드하는 방법은 무엇입니까? 그리고 이것을 자동으로 수행하는 방법이 있습니까?


" Compare buffer with saved version nnoremap gd :DiffSaved<CR>
Tom Hale

vim-faq를 설치 한 경우 오프라인 답변을 얻을 수 있습니다 : :h vim-faq및 검색 /reload. 기억하기 어려운 태그는 :h faq-5.8입니다.
Hotschke

답변:


172

원하는 명령은 :e(의 줄임말 :edit)입니다. 사용 :edit!하면 로컬 변경 사항이 삭제되고 다시로드됩니다.

set autoreadvimrc에서 vim이 자동으로이를 수행하도록 할 수도 있습니다 .


5
에 관한 경고 및 해결책에 대해서는 이 답변 을 참조하십시오 autoread.
Tom Hale

4
모든 버퍼에 대해이 작업을 수행하려면 사용 :bufdo :e또는:bufdo :e!
아론 H.

1
@AaronH. 고마워요! 나는 보통 한 번에 수백 개의 버퍼를 열고 분기를 전환 할 때 일반적으로 vim을 닫고 다시 시작하여 모든 버퍼를 새로운 내용으로 새로 고칩니다. 이것은 중요한 시간 절약이 될 것입니다!
g19fanatic

1
@AaronH. 두 번째 :는 선택 사항입니다. :bufdo e동일하게 작동합니다.
JoL

19

많은 경우이 답변이 설명하는 set autoread것처럼 작동하지 않습니다 .

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

포커스 이벤트는 트리거 autoread되지만 사용하지 않으면 캡처되지 않습니다 gvim. 따라서 vim터미널 창 또는 tmux 내 에서 일반을 ​​실행하는 경우 플러그인 vim-tmux-focus-events를 설치하십시오 .

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

set -g focus-events on

더 좋은 점을 위해 vim 내부에서 버퍼를 변경할 때 다음을 추가 vimrc하면 트리거 autoread됩니다 .

au FocusGained,BufEnter * :checktime

이것은 몇 년 동안 나를 귀찮게했습니다. 철저한 해결책에 감사드립니다! 💯😄
Nathan Long

9

Vim에서 현재 버퍼를 수정하는 외부 명령을 실행 한 경우 디스크가 변경되었으므로 파일을 다시로드하라는 메시지가 표시 될 수 있습니다. 실제로 :checktime명령을 사용하여이 프롬프트를 호출 할 수 있습니다 .


3

https://github.com/djoshea/vim-autoread 를 개선하는 멋진 플러그인autoread

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


Vi Stack Exchange에 오신 것을 환영합니다. 이것은 거의 링크 전용 답변입니다. 플러그인을 설명하면 플러그인을 개선 할 수 있습니다 (예 : 기능, OP의 목표를 달성하기 위해 어떻게 사용할 수 있습니까?)
John O'M.

0

파일의 내용을보고, 파일을 외부 적으로 업데이트하고, 변경된 파일을 표시하고, 필요할 때 파일을 편집 할 수있는 옵션이 있습니다. 이 답변 에서 영감을 얻은 Vim 서버 / 원격 명령 행 옵션으로 해결했습니다 .


다음 명령을 사용하면 외부 명령을 통해 파일을 다시로드 할 수 있습니다. 먼저 서버 인스턴스를 시작하면서 Vim으로 문제의 파일을 엽니 다.

vim --servername JABBERWOCKY /tmp/alice.log

파일이 외부에서 변경되었다고 가정합니다 (예 : a) echo "Curiouser and curiouser" >> /tmp/alice.log. 필요한 경우 서버 인스턴스에 명령을 보내 파일을 다시로드하십시오. 이 명령은 빠르게 완료되며 새 편집기를 생성하지 않습니다.

vim --servername JABBERWOCKY --remote-send ":e<CR>"

열린 파일이 Vim 및 외부에서 변경된 경우 다시로드하는 동안 충돌이 발생합니다 (경고 메시지가 표시됨). 이 경우 결정을 내려야합니다. 그대로두고 Vim에서 변경 사항을 유지하거나 로컬 변경 사항을 버리고 다시로드하십시오 .


--remote-send위 의 명령을 수동으로 다시로드해야합니다. 그러나이 명령은 Bash 's for/ while를 사용하거나 Linux / Unix에서 해키 한 라이너를 사용 하여 간단한 루프에 연결할 수 있습니다 .

watch -n 1 'vim --servername JABBERWOCKY --remote-send ":e<CR>"'

테스트되지는 않았지만 PowerShell에서도 이와 같은 것을 실현할 수 있다고 확신합니다.

Linux / Unix에서는 너무 미친 파일 시스템을 사용하지 않는 경우 inotify 라이브러리를 사용하여 파일 시스템 이벤트를 수신함으로써 이벤트 중심 접근 방식을 실현할 수 있습니다 . 개인적으로 나는 도구를 사용하여 좋아 ENTR 주요 리눅스 배포판에 포함 된 것으로 보인다 많이. 그럼 나는 얻는다 :

echo /tmp/alice.log | entr vim --servername JABBERWOCKY --remote-send ":e<CR>"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.