Cuando trabajo en un proyecto bajo control de versiones con git, a menudo quiero hacer algunas cosas en un shell que afectan a muchos de mis archivos abiertos, y luego revertir cada búfer que tengo abierto para asegurarme de no bloquear accidentalmente la nueva versión con lo que tenga abierto. Sé que magit
puede ser útil aquí, pero estoy acostumbrado a mi flujo de trabajo en el shell y me gustaría mantenerlo por ahora. Entonces, en cambio, me gustaría revertir todos los búferes abiertos, y tal vez cerrar cualquiera que haya dejado de existir (por ejemplo, debido a git checkout
una rama que ya no tiene ese archivo).
Tengo el siguiente fragmento de elisp que tomé de una búsqueda en Google:
(defun revert-all-buffers ()
"Refreshes all open buffers from their respective files"
(interactive)
(let* ((list (buffer-list))
(buffer (car list)))
(while buffer
(when (and (buffer-file-name buffer)
(not (buffer-modified-p buffer)))
(set-buffer buffer)
(revert-buffer t t t))
(setq list (cdr list))
(setq buffer (car list))))
(message "Refreshed open files"))
Pero esto rompe si se realiza un error en una de mis archivos abiertos, es decir, cuando se restituyan B1
, B2
, B3
, ..., Bn
un error al tratar de revertir B2
previene B3
- Bn
se revirtió a partir.
¿Cómo puedo decirle a emacs que ignore cualquier error que aparezca en este caso? No quiero usar global-auto-revert-mode
porque cada reversión desencadena algunas cosas pesadas como mi autocompletado y el verificador de sintaxis que vuelven a analizar el archivo, colgando emacs por un segundo más o menos.
fuente
B2
búfer en su ejemplo? Utilizo una función muy similar (muy probablemente derivada de este fragmento) y ha funcionado bien.C-x s
"file no longer exists"
.. aha! mi versión corrige eso :) Lo publicaré en breve.Respuestas:
Original
Aquí está mi versión ligeramente mejorada del fragmento en la pregunta. Al revisar mi historial de VC, confirmo que el fragmento a continuación comenzó como el fragmento publicado por el OP. Así que le pago el atributo a eso.
Aquí está el código que ha sido estable para mí:
Actualizar
Aquí hay una versión mejorada y mejor documentada de lo anterior después de ver la solución de @ Drew .
Referencia
fuente
Otro:
fuente
dolist
estilo para reemplazarcar
ypop
. Es curioso cómo puedes seguir mejorando tu configuración a medida que aprendes más elisp :)Acepté la respuesta de Kausal ya que era la más cercana a lo que quería, pero también tomé parte de la solución de Drew. Me envolvió
revert-buffer
enwith-demoted-errors
y dejó caer el:preserve-modes
parámetro para que mi comprobador de sintaxis sería volver a analizar todos los archivos abiertos. También dejé que elimine archivos modificados y no modificados, ya que a menudo me meto en problemas accidentalmenteC-x s
después degit checkout
abrir un archivo modificado.La versión final es:
fuente
Solucionaría esto con un
condition-case
oignore-errors
(documentos aquí ). No sé exactamente qué querrás que haga ; si desea hacer algo con errores, si puede usarcondition-case
para especificar el resultado, o puede usarignore-errors
para continuar. Algo como:fuente
Basado en la respuesta de @ Drew, con adiciones:
fuente