Wie lade ich eine Datei in einen Puffer zurück?


110

Normalerweise arbeite ich an Dateien, die über die Versionskontrolle im Dateisystem aktualisiert werden. Was ist eine schnelle Möglichkeit, eine Datei neu zu laden, ohne sie C-x C-ferneut zu laden und gefragt zu werden, ob ich sie neu laden möchte?

Antworten:


117

M-x revert-bufferwird genau das tun, was Sie wollen. Es wird immer noch um Bestätigung gebeten.

Eine andere Option (mein Favorit) ist die folgende Funktion:

;; 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))

8
Sie könnten die Bibliothek zitiert haben , dass dieser Code ist aus: misc-cmds.el. Nicht, dass es kompliziert wäre, aber wenn Sie etwas genau kopieren , ist es üblich, auf die Quelle zu verweisen.
Drew

3
Entschuldigung! Ich selbst war mir nicht sicher, woher ich diesen Ausschnitt habe. Ich hätte zumindest den Funktionsnamen googeln und versuchen sollen, seine Quelle zu finden, damit ich ihn hier gutschreiben kann. Update Ich habe die Quellen für alles, was ich kopiert habe, notiert. Ich war mir gerade nicht sicher: github.com/kaushalmodi/.emacs.d/blob/master/setup-files/…
Kaushal Modi

4
Ich würde diese Funktion nicht empfehlen. Es ist zu gefährlich, eine geänderte Datei versehentlich zu verwenden.
Gilles

2
@ Gilles Ich stimme zu, mit großer Kraft geht große Verantwortung einher. Ich würde das nicht an eine leicht zugängliche Bindung binden.
Kaushal Modi

6
Meine Variante wird nur dann zur Bestätigung auffordern, wenn der Puffer mit geändert wird (revert-buffer t (not (buffer-modified-p)) t).
Glucas

55

Es gibt auch auto-revert-modewelche die das automatisch machen und dir Feedback geben.

Aus der Doc-Zeichenfolge:

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.

50

Eine andere Option, die ich benutze, ist find-alternate-filegebunden an C-x C-v. Dies öffnet eine Datei, die Ihren aktuellen Puffer wiederverwendet.

Standardmäßig zeigt es auf die Datei, in der Sie sich gerade befinden. Sie können also einfach eingeben C-x C-v RET, um Ihre Datei neu zu laden. Es wird nicht aufgefordert, es sei denn, Ihr Puffer hat nicht gespeicherte Daten.

Einige Nicht-Text-Modi wie image-mode(zum Rendern von Bildern, PDFs, SVGs usw.) und diredhaben für einen schnelleren Zugriff revert-buffergebunden g.


3
Das ist mein neues Ziel. Danke, dass du es erwähnt hast.
ramsey_tm

Ich hatte eine (ffap-Bindung) in meinem .emacs, die die Bindung von zu ändern scheint C-x C-v.
Ychaouche

Das ist großartig, danke! Einfach und effektiv. Übrigens, wie macht man Emacs darauf aufmerksam, dass sich die aktuelle Datei geändert hat? Zum Beispiel erkennt VIM im GUI-Modus eine Dateiänderung automatisch, wenn die App den Fokus erhält (es wird vom Hintergrund auf umgeschaltet).
mato

Dies sollte die akzeptierte Antwort sein.
Toon Claes

10

Emacs nennt das reverting.

Mit können Sie die aktuelle Datei wiederherstellen M-x revert-buffer. Dies fordert zur Bestätigung auf, ob die Datei geändert wurde oder nicht, mit Ausnahme von Dateien, die mit den in der Variablen aufgelisteten Mustern übereinstimmen revert-without-query(Einzelheiten finden Sie im Handbuch). Ein weiteres Ärgernis revert-bufferist gelegentlich, dass der Dateimodus auf die Standardeinstellungen zurückgesetzt wird.

Ich benutze die folgende Funktion, um eine Reihe von Dateien mit dem angegebenen Namen wiederherzustellen. Wenn eine Datei in einem Puffer nicht geöffnet ist, wird sie ignoriert.

(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)))))))

Ein typischer Anwendungsfall für diese Funktion ist das Aktualisieren von Dateien über die Versionskontrolle. Verwenden Sie emacsclientdiese Option, revert-filesum alle aktualisierten Dateien oder (dies ist einfacher und nur geringfügig langsamer) alle von der Aktualisierung betroffenen Dateien aufzurufen. Ich rufe das folgende Shell-Skript auf und übergebe ihm die Dateien als Argumente:

#! /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)"

Anwendungsbeispiel:

svn update
find -name .svn -prune -o -type f -exec emacsclient-revert {} +

In diesen Tagen, wie @webappzero in seiner Antwort sagt, löst Magit diesen Teil des Problems der Rückgängigmachung von Dateien schmerzlos
Croad Langshan

8

Sie können den globalen Auto-Revert-Modus auch wie unten gezeigt aktivieren

(global-auto-revert-mode 1)

Dies ist hilfreich, wenn Sie viele Überprüfungen Ihrer js-Dateien mit aktiviertem Auto-Fix-Modus durchführen, wie in jssc.


7

revert-bufferGibt es. Aber ich hätte gerne Feedback.

Ich habe folgendes in meinem .emacs.

(global-set-key (kbd "C-c r") (lambda ()
                                (interactive)
                                (revert-buffer t t t)
                                (message "buffer is reverted")))

3

Sie können verwenden find-alternate-file, was C-x C-vstandardmäßig gebunden ist , und einfach RETan der Eingabeaufforderung eingeben, um die Datei neu zu laden.


3

Für Spacemacs-Benutzer: SPC b R( spacemacs/safe-revert-buffer).

Zum Überspringen der Bestätigung decken andere Antworten dies bereits ab, obwohl ich anderen zustimme, dass es wahrscheinlich keine gute Idee ist, dies an einen Schlüssel zu binden.


2

Magit verwaltet Dateireversionen automatisch für Sie und löst so Ihr Kernproblem. Sie profitieren auch von den anderen Funktionen.

Hier sind die Dokumente zum Ändern der Einstellungen, an denen Sie interessiert sind:

Wenn Sie bei Magit bleiben, müssen Sie auch alle drei globalen WIP-Modi (Work In Progress) aktivieren , um einen Arbeitsverlust zu vermeiden.

Auf diese Weise können Sie in Emacs mit Magit Versionskontrollaktionen durchführen und Ihr ursprüngliches Problem vollständig vermeiden.


1
Bitte lassen Sie mich wissen, ob dies hilfreich ist.
Webappzero

Diese Antwort sollte mehr positive Stimmen haben! Falls nicht klar ist: Die WIP-Modi sind möglicherweise in Ordnung (ich verwende sie derzeit nicht), sie sind jedoch nicht unbedingt erforderlich, damit das Wiederherstellungsproblem für Sie behoben werden kann.
Croad Langshan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.