Jak ponownie załadować bieżący plik?


145

Dość często pracuję z plikami, które są kontrolowane wersjami, więc możliwe jest, że zmiany zostaną wprowadzone w nich poza Vimem.

Jaki jest szybki sposób na ponowne załadowanie pliku bez konieczności zamykania i ponownego otwierania Vima? Czy istnieje sposób, aby to zrobić automatycznie?


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

Jeśli zainstalowałeś vim-faq , możesz tam uzyskać odpowiedź offline: :h vim-faqi wyszukać /reload. Trudno zapamiętać tag :h faq-5.8.
Hotschke

Odpowiedzi:


172

Polecenie, które chcesz, to :e(skrót od :edit). Jeśli :edit!go użyjesz , odrzuci lokalne zmiany i przeładuje.

Możesz również poprosić vima, aby zrobił to automatycznie set autoreadw swoim vimrc.


5
Zobacz tę odpowiedź, aby uzyskać zastrzeżenia i rozwiązania dotyczące autoread.
Tom Hale

4
Aby to zrobić dla wszystkich buforów, użyj :bufdo :elub:bufdo :e!
Aaron H.

1
@AaronH. Dziękuję za to! zazwyczaj mam setki buforów otwartych na raz, a podczas zmiany gałęzi, zwykle po prostu zamykam vima i restartuję, aby odświeżyć wszystkie bufory z nową zawartością. Będzie to znacząca oszczędność czasu!
g19fanatic

1
@AaronH. Drugi :jest opcjonalny: :bufdo ebędzie działał tak samo.
JoL

19

W wielu przypadkach set autoreadnie zadziała, ponieważ ta odpowiedź wyjaśnia:

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

Zdarzenia fokusu zostaną uruchomione autoread, ale nie zostaną one przechwycone, chyba że zostaną użyte gvim. Tak więc, jeśli vimdziałasz gładko w oknie terminala lub tmux, zainstaluj wtyczkę vim-tmux-focus-events .

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

set -g focus-events on

Aby uzyskać dodatkowe dobroci, dodając następujące wpisy do vimrcspowodują autoreadprzy wymianie buforów wewnątrz natomiast wewnątrz vim:

au FocusGained,BufEnter * :checktime

Denerwuje mnie to od lat. Dzięki za dokładne rozwiązanie! 💯😄
Nathan Long,

9

Jeśli kiedykolwiek uruchomiłeś zewnętrzne polecenie Vima, które modyfikuje bieżący bufor, być może zauważyłeś, że monituje o ponowne załadowanie pliku, ponieważ zmiany zostały wprowadzone na dysku. Możesz faktycznie wywołać ten monit za pomocą :checktimepolecenia.


3

Ładna wtyczka do poprawy autoread https://github.com/djoshea/vim-autoread

Automatycznie powoduje, że vim przeładowuje pliki, które zostały zapisane na dysku, ale nie zostały zmodyfikowane w buforze od ostatniego zapisu z vima. Umożliwia to edycję pliku otwartego w vimie przy użyciu innej aplikacji i zapisanie go. Po powrocie do vima, dopóki plik nie został zmodyfikowany od ostatniej zmiany, plik zostanie automatycznie zaktualizowany, aby odzwierciedlić zmiany dokonane na dysku, tak jakbyś nacisnął: e ręcznie.


Witamy na Vi Stack Exchange. To prawie odpowiedź tylko do linku. Możesz go ulepszyć, opisując wtyczkę (np. Co ona robi? W jaki sposób można ją wykorzystać do osiągnięcia celów OP?)
John O'M.

0

Miałem problem z przeglądaniem zawartości pliku, aktualizacją pliku zewnętrznie, wyświetlaniem zmienionego pliku i możliwością edycji w razie potrzeby. Rozwiązałem go za pomocą opcji serwera / zdalnego wiersza poleceń Vima, zainspirowanych tą odpowiedzią .


Za pomocą następujących poleceń plik można ponownie załadować za pomocą polecenia zewnętrznego. Najpierw otwórz ten plik za pomocą Vima, uruchamiając instancję serwera.

vim --servername JABBERWOCKY /tmp/alice.log

Załóżmy, że plik został zmieniony zewnętrznie, np. Przez echo "Curiouser and curiouser" >> /tmp/alice.log. W razie potrzeby wyślij polecenie do instancji serwera, aby ponownie załadować plik. To polecenie skończy się szybko i nie pojawi się nowy edytor.

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

Jeśli otwarty plik został zmieniony w Vimie i zewnętrznie, wystąpi konflikt podczas przeładowania (pojawi się komunikat ostrzegawczy). W takim przypadku należy podjąć decyzję: Pozostaw to i zachowaj zmiany w Vimie lub odrzuć zmiany lokalne i wymuś przeładowanie .


Polecenie z --remote-sendpowyższym wymaga ręcznego przeładowania. Jednak to polecenie można powiązać z prostą pętlą, używając Bash's for/ while, lub używając zhackowanego one-linera w Linux / Unix:

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

Chociaż nie zostało to przetestowane, jestem pewien, że coś takiego można również zrealizować w PowerShell.

W systemie Linux / Unix podejście oparte na zdarzeniach można zrealizować poprzez nasłuchiwanie zdarzeń w systemie plików przy użyciu np. Biblioteki inotify , jeśli nie używasz zbyt zwariowanych systemów plików. Osobiście bardzo lubię korzystać z narzędzia entr , które wydaje się być zawarte w głównych dystrybucjach Linuksa. Potem dostaję:

echo /tmp/alice.log | entr vim --servername JABBERWOCKY --remote-send ":e<CR>"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.