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 magitpuede 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 checkoutuna 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, ..., Bnun error al tratar de revertir B2previene B3- Bnse revirtió a partir.
¿Cómo puedo decirle a emacs que ignore cualquier error que aparezca en este caso? No quiero usar global-auto-revert-modeporque 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

B2bú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
dolistestilo para reemplazarcarypop. 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-bufferenwith-demoted-errorsy dejó caer el:preserve-modespará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 sdespués degit checkoutabrir un archivo modificado.La versión final es:
fuente
Solucionaría esto con un
condition-caseoignore-errors(documentos aquí ). No sé exactamente qué querrás que haga ; si desea hacer algo con errores, si puede usarcondition-casepara especificar el resultado, o puede usarignore-errorspara continuar. Algo como:fuente
Basado en la respuesta de @ Drew, con adiciones:
fuente