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-buffer
es 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 emacsclient
para llamar revert-files
a 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 {} +
misc-cmds.el
. No es que sea complicado, pero cuando copias algo exactamente , es una cortesía común señalar la fuente.