Odśwież zmienioną zawartość pliku otwartego w vi (m)

362

Mam plik konfiguracyjny, który trzymam otwarty w vimie, ale czasem zmienia się on na dysku, a zmiany te nie są odzwierciedlane w terminalu. Czy mogę odświeżyć zawartość ekranu bez zamykania i ponownego otwierania pliku? Jeśli tak to jak?

twan163
źródło
Podsumowanie: wszystkie dotychczasowe odpowiedzi są w stylu „Ankieta” zamiast w stylu „Push”. Oznacza to, że zamiast odbierać zewnętrzne zdarzenie zmiany pliku, tak jak miało to miejsce w przypadku podobnych funkcji innego oprogramowania, odpowiedzi te polegają na vimie aktywnie sondującym zmianę pliku, ręcznie lub wywołaną przez akcję użytkownika lub timer. W rezultacie nie zobaczysz natychmiast odświeżonej zmiany na ekranie.
Penghe Geng

Odpowiedzi:

464

Możesz użyć :editpolecenia, bez określania nazwy pliku, aby ponownie załadować bieżący plik. Jeśli dokonałeś modyfikacji pliku, możesz użyć :edit!do wymuszenia przeładowania bieżącego pliku (stracisz swoje modyfikacje).

Polecenie :editmoże być skrócone przez :e. W ten sposób można wymusić edycję:e!

Thushi
źródło
2
„!” potknął się o mnie, ale teraz jest jasne.
twan163
107
Uwaga: zwykle jest to skrót :e!.
Stéphane Chazelas
31
@StephaneChazelas: Tak, zgadza się :) @ twan163: Zamiast :editi :edit!możesz używać :ei :e!odpowiednio.
Thushi,
11
Strać modyfikacje, tak i nie. Co najważniejsze, można jeszcze uNdo :e!.
gerrit,
5
Ponadto, jeśli chcesz ponownie załadować wszystkie swoje bufory, uruchom::bufdo e
pkout
193

Oprócz ręcznego odświeżania pliku :edit, możesz umieścić go w swoim~/.vimrc

:set autoread

aby Vim automatycznie odświeżał wszystkie pliki, które nie były edytowane przez Vima. Zobacz także :checktime.

Ingo Karkat
źródło
2
Kupujący strzeż się - jeśli pracujesz nad świeżym kodem i git pullpamiętasz, że możesz niezamierzenie utracić niezapisane zmiany na ekranie.
azatar
5
@toszter Nie, Vim odświeży tylko niezmienione bufory. W przypadku zmian nadal pojawi się zapytanie: Zachować czy załadować?
Ingo Karkat
10
Uwaga: autoread nie działa automatycznie. Musisz albo użyć gvimpoleceń zewnętrznych.
Sparhawk
3
Użytkownicy używający vima w tmux mogą uzyskać zdarzenia fokusowe, używając github.com/tmux-plugins/vim-tmux-focus-events . W przeciwnym razie autoread nie pomoże w terminalu, chyba że w jakiś sposób zadzwonisz:checktime
Karl Bartel
3
autoreadmożna uruchomić automatycznie X sekund po zatrzymaniu kursora, zobacz tę odpowiedź .
Tom Hale
57

TL; DR

Przejdź do Wrap-upnagłówka vimrclinii, aby dodać, aby Twoje życie było lepsze.

Ręcznie

Biegać :checktime

Sprawdź, czy jakieś bufory zostały zmienione poza Vimem. To sprawdza i ostrzega, jeśli skończysz z dwiema wersjami pliku.

Automatycznie

Aby automatycznie ładować zmiany, dodaj vimrc:

set autoread

Gdy zostanie wykryty plik, który został zmieniony poza Vimem i nie został zmieniony w Vimie, automatycznie przeczytaj go ponownie. Po usunięciu pliku nie jest to wykonywane.

Ta odpowiedź dodaje zastrzeżenie:

AutoRead nie przeładować plik, chyba że coś takiego uruchomienia zewnętrznego polecenia zrobić (jak !lslub !shetc)

Czytaj dalej, aby znaleźć rozwiązania.

Uruchom, gdy kursor przestanie się poruszać

Dodaj do vimrc:

au CursorHold,CursorHoldI * checktime

Domyślnie CursorHold jest uruchamiany po tym, jak kursor pozostaje nieruchomy przez 4 sekundy, i można go skonfigurować za pomocą aktualizacji .

Wyzwalaj przy zmianie bufora lub ustawieniu ostrości terminala

Dodaj następujące elementy do swojego vimrcwyzwalacza autoreadpodczas zmiany buforów w vimie:

au FocusGained,BufEnter * :checktime

Łapanie okna terminalu skupia się na zwykłym vimie

Aby FocusGained(patrz wyżej) działać w zwykłym vimie, w emulatorze terminali (Xterm, tmux itp.) Zainstaluj wtyczkę: vim-tmux-focus-events

W wersjach Tmux> 1.9 musisz dodać .tmux.conf:

set -g focus-events on

Zakończyć

Powiadomienia, gdy autoreadmożliwe są również wyzwalacze .

Oto moje vimrclinie do wdrożenia wszystkich powyższych:

" 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

Dzięki ErichBSchulz za skierowanie mnie we właściwym kierunkuau CursorHold .

Tom Hale
źródło
2
doskonały post! Czuje się jedną z tych rzeczy, w których powinno to być zachowanie domyślne
JonnyRaa,