Jak ponownie załadować plik do bufora?

110

Zwykle pracuję na plikach, które są aktualizowane w systemie plików za pomocą kontroli wersji. Jaki jest szybki sposób na ponowne załadowanie pliku bez konieczności ponownego ładowania pliku C-x C-fi pytania, czy chcę go ponownie załadować?

Fernando Briano
źródło

Odpowiedzi:

117

M-x revert-bufferzrobi dokładnie to, co chcesz. Nadal poprosi o potwierdzenie.

Inną opcją (moją ulubioną) jest poniższa funkcja:

;; Source: http://www.emacswiki.org/emacs-en/download/misc-cmds.el
(defun revert-buffer-no-confirm ()
    "Revert buffer without confirmation."
    (interactive)
    (revert-buffer :ignore-auto :noconfirm))
Kaushal Modi
źródło
8
Mogłeś cytowane bibliotekę że kod jest od: misc-cmds.el. Nie chodzi o to, że jest to skomplikowane, ale kiedy kopiujesz coś dokładnie , powszechną uprzejmością jest wskazanie źródła.
Drew
3
Przeprosiny! Ja sam nie byłem pewien, skąd wziąłem ten fragment. Powinienem przynajmniej przejrzeć nazwę funkcji i spróbować znaleźć jej źródło, aby ją tutaj przypisać. Aktualizacja Zanotowałem źródła wszystkiego, co skopiowałem; po prostu nie byłem pewien: github.com/kaushalmodi/.emacs.d/blob/master/setup-files/…
Kaushal Modi
4
Nie poleciłbym tej funkcji. Zbyt niebezpieczne jest przypadkowe użycie na zmodyfikowanym pliku.
Gilles
2
@Gilles Zgadzam się, z wielką mocą wiąże się wielka odpowiedzialność. Nie powiązałbym tego z łatwo dostępnym wiązaniem.
Kaushal Modi
6
Mój wariant tego poprosi o potwierdzenie tylko wtedy, gdy bufor zostanie zmodyfikowany, używając (revert-buffer t (not (buffer-modified-p)) t).
glucas,
55

Jest też to, auto-revert-modeco robi to automatycznie i przekazuje informacje zwrotne.

Z ciągu dokumentów:

auto-revert-mode is an interactive autoloaded compiled Lisp function
in `autorevert.el'.

(auto-revert-mode &optional ARG)

Toggle reverting buffer when the file changes (Auto Revert mode).
With a prefix argument ARG, enable Auto Revert mode if ARG is
positive, and disable it otherwise.  If called from Lisp, enable
the mode if ARG is omitted or nil.

Auto Revert mode is a minor mode that affects only the current
buffer.  When enabled, it reverts the buffer when the file on
disk changes.

Use `global-auto-revert-mode' to automatically revert all buffers.
Use `auto-revert-tail-mode' if you know that the file will only grow
without being changed in the part that is already in the buffer.
thermans
źródło
50

Inna opcja, z której korzystam, jest find-alternate-filezwiązana C-x C-v. Spowoduje to otwarcie pliku przy użyciu bieżącego bufora.

Domyślnie wskazuje plik, w którym aktualnie się znajdujesz, więc możesz po prostu wpisać, C-x C-v RETaby ponownie załadować plik. Nie wyświetli monitu, chyba że bufor zawiera niezapisane dane.

Niektóre tryby nietekstowe, takie jak image-mode(używane do renderowania zdjęć, plików PDF, plików svg ... itd.), I diredmają revert-bufferna gcelu szybszy dostęp.

Tikhon Jelvis
źródło
3
To jest mój nowy idź do. Dzięki, że o tym wspomniałeś.
ramsey_tm
Miałem (ffap-bindings) w moich .emacs, które wydają się zmieniać wiązanie C-x C-v.
ychaouche
To wspaniale, dzięki! Prosty i skuteczny. Przy okazji, jak sprawić, aby Emacs zauważył, że bieżący plik się zmienił? Na przykład VIM w trybie GUI automatycznie wykrywa zmianę pliku, gdy aplikacja zostanie zogniskowana (zostanie przełączona z tła).
mato
To powinna być zaakceptowana odpowiedź.
Toon Claes
10

Emacs nazywa to reverting.

Możesz przywrócić bieżący plik za pomocą M-x revert-buffer. To monituje o potwierdzenie, czy plik został zmodyfikowany, czy nie, z wyjątkiem plików pasujących do wzorów wymienionych w zmiennej revert-without-query(szczegółowe informacje można znaleźć w instrukcji). Inną sporadyczną uciążliwością revert-bufferjest to, że resetuje tryb plików do domyślnych.

Korzystam z następującej funkcji, aby przywrócić wiązkę plików podaną według nazwy. Jeśli plik nie zostanie otwarty w jakimś buforze, zostanie zignorowany.

(defun revert-files (&rest files)
  "Reload all specified files from disk.
Only files that are currently visited in some buffer are reverted.
Do not ask confirmation unless the buffer is modified."
  (save-excursion
    (let ((revert-without-query '("")))
      (dolist (file-name files)
        (message "Considering whether to revert file %s" file-name)
        (let ((buf (find-buffer-visiting file-name)))
          (when buf
            (message "Reverting file in buffer %s" (buffer-name buf))
            (set-buffer buf)
        (revert-buffer t nil t)))))))

Typowym przypadkiem użycia tej funkcji jest po zaktualizowaniu plików z kontroli wersji. Służy emacsclientdo wywoływania revert-fileswszystkich plików, które zostały zaktualizowane, lub (jest to łatwiejsze i tylko nieco wolniejsze) dla wszystkich plików objętych aktualizacją. Wywołuję następujący skrypt powłoki, przekazując mu pliki jako argumenty:

#! /bin/sh
# Similar to gnuclient, but call `revert-files' on the files.
files=

## Find a way to convert a path to absolute. Bizarre OSes such as Windows
## require special cases. We also try to detect non-filenames such as URIs.
case `uname -s` in
  CYGWIN*)
    absolute_path () {
      cygpath -a -w -- "$1"
    };;
  *)
    wd="`pwd -P 2>/dev/null || pwd`"
    absolute_path () {
      case "$1" in
        /*) printf '%s' "$1";; # ordinary absolute path
        *:/*)
          if expr "z$1" : 'z[0-9A-Z_a-z][-.0-9@A-Z_a-z]*:/.*'; then
            printf '%s' "$1" # URI or machine:/some/path
          else
            printf '%s' "$wd/$1" # default to a relative path
          fi;;
        *) printf '%s' "$wd/$1";; # default to a relative path
      esac
    };;
esac

for x; do
  files="$files \"`absolute_path "$x" | sed 's/[\\\\\\\"]/\\\\&/g'`\""
done
exec emacsclient -e "(revert-files$files)"

Przykład użycia:

svn update
find -name .svn -prune -o -type f -exec emacsclient-revert {} +
Gilles
źródło
Obecnie, jak mówi @webappzero w swojej odpowiedzi, magit bezboleśnie rozwiązuje tę część problemu z przywracaniem plików
Croad Langshan,
8

możesz także włączyć tryb globalnego automatycznego przywracania, jak pokazano poniżej

(global-auto-revert-mode 1)

jest to pomocne, gdy wykonujesz wiele kontroli plików js z włączonym trybem automatycznej naprawy, np. w jssc.

DmitrySemenov
źródło
7

revert-bufferjest tu. Ale lubię mieć jakieś opinie.

Mam w sobie następujące .emacs.

(global-set-key (kbd "C-c r") (lambda ()
                                (interactive)
                                (revert-buffer t t t)
                                (message "buffer is reverted")))
kindahero
źródło
3

Możesz użyć find-alternate-file, który jest C-x C-vdomyślnie związany, i po prostu wpisać RETw wierszu polecenia, aby ponownie załadować plik.

DoMiNeLa10
źródło
3

Dla użytkowników spacemacs: SPC b R( spacemacs/safe-revert-buffer).

Aby pominąć potwierdzenie, inne odpowiedzi już to obejmują, chociaż zgadzam się z innymi, że prawdopodobnie nie jest dobrym pomysłem powiązanie tego z kluczem.

Croad Langshan
źródło
2

Magit automatycznie zarządza odwracaniem plików, rozwiązując w ten sposób główny problem. Korzystasz również z jego innych funkcji.

Oto dokumenty dotyczące dostosowywania ustawień, które Cię interesują:

Jeśli pozostaniesz przy Magit, pamiętaj, aby włączyć wszystkie 3 globalne tryby WIP (Work In Progress), aby uniknąć utraty pracy.

W ten sposób możesz wykonywać akcje kontroli wersji w Emacsie za pomocą Magit i całkowicie unikać pierwotnego problemu.

webappzero
źródło
1
Daj mi znać, jeśli jest to pomocne.
webappzero
Ta odpowiedź powinna mieć więcej głosów pozytywnych! W przypadku niejasności: tryby WIP mogą być dobre (obecnie ich nie używam), ale nie są absolutnie konieczne, aby rozwiązać problem z przywracaniem.
Croad Langshan,