¿Cómo recargo un archivo en un búfer?


110

Por lo general, trabajo en archivos que se actualizan en el sistema de archivos a través del control de versiones. ¿Cuál es una forma rápida de volver a cargar un archivo sin tener C-x C-fque volver a hacerlo y que me pregunten si quiero volver a cargarlo?

Respuestas:


117

M-x revert-bufferHará exactamente lo que quieras. Seguirá pidiendo confirmación.

Otra opción (mi favorita) es la siguiente función:

;; 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
Es posible que haya citado la biblioteca que ese código es de: misc-cmds.el. No es que sea complicado, pero cuando copias algo exactamente , es una cortesía común señalar la fuente.
Dibujó

3
Disculpas! Yo mismo no estaba seguro de dónde obtuve ese fragmento. Al menos debería haber buscado en Google el nombre de la función e intentar encontrar su fuente para poder acreditarlo aquí. Actualización He anotado las fuentes de todo lo que copié; simplemente no estaba seguro de esto: github.com/kaushalmodi/.emacs.d/blob/master/setup-files/…
Kaushal Modi

44
No recomendaría esta función. Es demasiado peligroso usarlo accidentalmente en un archivo modificado.
Gilles

2
@Gilles Estoy de acuerdo, con un gran poder viene una gran responsabilidad. No lo vincularía a un enlace de fácil acceso.
Kaushal Modi

66
Mi variante de esto solicitará confirmación solo si se modifica el búfer, usando (revert-buffer t (not (buffer-modified-p)) t).
glucas

55

También hay uno auto-revert-modeque lo hace automáticamente y te da retroalimentación.

De la cadena de documentación:

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

Otra opción, que yo uso, está find-alternate-fileobligada C-x C-v. Esto abre un archivo que reutiliza su búfer actual.

De manera predeterminada, apunta al archivo en el que se encuentra actualmente, por lo que puede escribir C-x C-v RETpara volver a cargar su archivo. No se mostrará a menos que su búfer tenga datos no guardados.

Algunos modos no son de texto como image-mode(utilizado para las fotos de representación, pdfs, svgs ... etc) y diredhan revert-bufferobligado a gun acceso más rápido.


3
Este es mi nuevo ir a. Gracias por mencionarlo.
ramsey_tm

Tuve un (ffap-bindings) en mi .emacs que parece cambiar el enlace de C-x C-v.
ychaouche

Esto es genial, gracias! Simple y efectivo. Por cierto, ¿cómo hacer que Emacs note que el archivo actual ha cambiado? Por ejemplo, VIM en modo GUI detecta un cambio de archivo automáticamente cuando la aplicación obtiene el foco (se cambia de fondo).
mato

Esta debería ser la respuesta aceptada.
Toon Claes

10

Emacs llama a esto reverting.

Puede revertir el archivo actual con M-x revert-buffer. Esto solicita confirmación si el archivo ha sido modificado o no, excepto los archivos que coinciden con los patrones enumerados en la variable revert-without-query(consulte el manual para más detalles). Otra molestia ocasional revert-bufferes que restablece el modo de archivo al predeterminado.

Utilizo la siguiente función para revertir un montón de archivos, dados por nombre. Si un archivo no se abre en algún búfer, se ignora.

(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 de uso típico para esta función es después de actualizar archivos desde el control de versiones. Use emacsclientpara llamar revert-filesa todos los archivos que se han actualizado, o (esto es más fácil, y solo un poco más lento) en todos los archivos afectados por la actualización. Llamo al siguiente script de shell, pasándole los archivos como argumentos:

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

Ejemplo de uso:

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

En estos días, como dice @webappzero en su respuesta, magit resuelve esta parte del problema de reversión de archivos sin dolor
Croad Langshan

8

También puede habilitar el modo de auto-reversión global como se muestra a continuación

(global-auto-revert-mode 1)

Esto es útil cuando realiza muchas comprobaciones de sus archivos js con el modo de reparación automática habilitado, como en jssc.


7

revert-bufferesta ahí. Pero me gusta tener algunos comentarios.

Tengo lo siguiente en mi .emacs.

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

3

Puede usar find-alternate-file, que está vinculado C-x C-vde forma predeterminada, y simplemente escriba RETen el indicador para volver a cargar el archivo.


3

Para usuarios de spacemacs: SPC b R( spacemacs/safe-revert-buffer).

Para omitir la confirmación, otras respuestas ya cubren eso, aunque estoy de acuerdo con otros en que probablemente no sea una buena idea vincular eso a una clave.


2

Magit gestiona las reversiones de archivos automáticamente, resolviendo así su problema central. También se beneficia de sus otras características.

Estos son los documentos para ajustar la configuración que le interesa:

Si te quedas con Magit, también asegúrate de habilitar los 3 modos WIP globales (Work In Progress) para evitar perder el trabajo.

De este modo, puede realizar acciones de control de versiones dentro de Emacs con Magit y evitar su problema original por completo.


1
Por favor, avíseme si esto es útil.
webappzero

¡Esta respuesta debería tener más votos a favor! En caso de que no esté claro: los modos WIP pueden ser buenos (no los uso actualmente), pero no son estrictamente necesarios para que pueda resolver el problema de reversión.
Croad Langshan