Come ricaricare un file in un buffer?


110

Di solito lavoro su file che vengono aggiornati nel file system tramite il controllo della versione. Qual è un modo rapido per ricaricare un file senza doverlo C-x C-fripetere e chiedermi se voglio ricaricarlo?

Risposte:


117

M-x revert-bufferfarà esattamente quello che vuoi. Chiederà comunque conferma.

Un'altra opzione (la mia preferita) è la seguente funzione:

;; 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
Si potrebbe avere citato la libreria che che il codice è da: misc-cmds.el. Non che sia complicato, ma quando si copia esattamente qualcosa è cortesia comune puntare alla fonte.
Drew

3
Scuse! Io stesso non ero sicuro di dove avessi preso quel frammento. Avrei dovuto almeno cercare su Google il nome della funzione e cercare di trovare la sua fonte in modo da poterlo accreditare qui. Aggiornamento Ho annotato le fonti per tutto ciò che ho copiato; non ne ero sicuro: github.com/kaushalmodi/.emacs.d/blob/master/setup-files/…
Kaushal Modi

4
Non consiglierei questa funzione. È troppo pericoloso da usare accidentalmente su un file modificato.
Gilles,

2
@Gilles Sono d'accordo, con un grande potere derivano grandi responsabilità. Non lo legherei a un binding di facile accesso.
Kaushal Modi,

6
La mia variante di questo richiederà conferma solo se il buffer viene modificato, utilizzando (revert-buffer t (not (buffer-modified-p)) t).
Glucas,

55

C'è anche quello auto-revert-modeche lo fa automaticamente e ti dà feedback.

Dalla stringa doc:

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

Un'altra opzione, che uso, è find-alternate-filedestinata a C-x C-v. Questo apre un file riutilizzando il buffer corrente.

Per impostazione predefinita, punta al file in cui ti trovi attualmente, quindi puoi semplicemente digitare C-x C-v RETper ricaricare il file. Non verrà richiesto a meno che nel buffer non siano presenti dati non salvati.

Alcune modalità non testuali come image-mode(utilizzate per il rendering di immagini, pdf, svg ... ecc.) E diredsono revert-buffervincolate a gun accesso più rapido.


3
Questo è il mio nuovo appuntamento. Grazie per averlo menzionato.
ramsey_tm,

Ho avuto un (ffap-binding) nel mio .emacs che sembra cambiare il legame di C-x C-v.
ychaouche,

Questo è fantastico, grazie! Semplice ed efficace A proposito, come fare in modo che Emacs noti che il file corrente è cambiato? Ad esempio, VIM in modalità GUI rileva automaticamente una modifica del file quando l'app viene messa a fuoco (passa allo sfondo).
mato

Questa dovrebbe essere la risposta accettata.
Toon Claes,

10

Emacs chiama questo reverting.

È possibile ripristinare il file corrente con M-x revert-buffer. Ciò richiede la conferma se il file è stato modificato o meno, ad eccezione dei file che corrispondono ai modelli elencati nella variabile revert-without-query(vedere il manuale per i dettagli). Un altro fastidio occasionale di revert-bufferè che ripristina la modalità file ai valori predefiniti.

Uso la seguente funzione per ripristinare un mucchio di file, dato per nome. Se un file non viene aperto in un buffer, viene ignorato.

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

Un caso d'uso tipico di questa funzione è dopo l'aggiornamento dei file dal controllo versione. Utilizzare emacsclientper chiamare revert-filestutti i file che sono stati aggiornati o (è più semplice e solo leggermente più lento) su tutti i file interessati dall'aggiornamento. Chiamo il seguente script di shell, passandogli i file come argomenti:

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

Esempio di utilizzo:

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

In questi giorni, come dice @webappzero nella sua risposta, magit risolve indolore questa parte del problema di ripristino dei file
Croad Langshan,

8

puoi anche abilitare la modalità di ripristino automatico globale come mostrato di seguito

(global-auto-revert-mode 1)

questo è utile quando fai molti controlli dei tuoi file js con la modalità di correzione automatica abilitata, come in jssc.


7

revert-bufferè lì. Ma mi piace avere un feedback.

Ho il seguente nel mio .emacs.

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

3

È possibile utilizzare find-alternate-file, che è associato per C-x C-vimpostazione predefinita, e semplicemente digitare RETal prompt per ricaricare il file.


3

Per gli utenti di spacemacs: SPC b R( spacemacs/safe-revert-buffer).

Per saltare la conferma, altre risposte lo coprono già, anche se concordo con gli altri sul fatto che probabilmente non è una buona idea associarlo a una chiave.


2

Magit gestisce automaticamente le reversioni dei file, risolvendo così il tuo problema principale. Approfitti anche delle sue altre funzionalità.

Ecco i documenti per modificare le impostazioni che ti interessano:

Se rimani con Magit, assicurati anche di abilitare tutte e 3 le modalità WIP globali (Work In Progress) per evitare di perdere il lavoro.

È quindi possibile eseguire azioni di controllo della versione all'interno di Emacs con Magit ed evitare del tutto il problema originale.


1
Per favore fatemi sapere se questo è utile.
webappzero,

Questa risposta dovrebbe avere più voti! Nel caso non sia chiaro: le modalità WIP potrebbero essere buone (non le uso attualmente), ma non sono strettamente necessarie per risolvere il problema di ripristino.
Croad Langshan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.