¿Cómo guardar una copia de un búfer en un archivo?


9

Me gustaría poder guardar una copia (o una instantánea) de un búfer en un archivo. El comportamiento sería similar write-file, excepto que no establecería el búfer para visitar este archivo.

Para un caso de uso, imagine que tiene una sesión de shell y desea guardarlo rápidamente en un archivo de registro. No se debe cambiar el nombre del búfer (para que las funciones que dependen del nombre del búfer sigan funcionando), y no se debe visitar un archivo (para que el archivo no se sobrescriba accidentalmente y no haya ninguna advertencia al salir de emacs).

Puedo imaginar algunas formas sucias de hacer esto, publicaré una como respuesta propia, pero leyendo el manual, todo el sistema de "archivos visitados" es más complicado de lo que parece, y supongo que es fácil redactar un Solución incorrecta ¿Hay una forma oculta, incorporada, de lograr esto?

Respuestas:


18

Simplemente seleccione todo el búfer ( C-x h) y utilícelo write-region.


3
No necesita seleccionar el texto del búfer, si lo está utilizando write-regiondesde Lisp (por ejemplo, en su propio comando). Simplemente pásalo (point-min)y (point-max), junto con el nombre del archivo.
Dibujó el

2
C-x h M-x write-region
Jakub Narębski

Gracias por el búfer de selección y el M-x write-regioncomando real .
Grant Bowman

0

Sucio elisphaciendo lo que quiero hacer:

(defun tv/copy-buffer-to-file (filename)
  (interactive "sFile to write? ")
  (let ((bufname (buffer-name)))
    (set-visited-file-name filename)
    (save-buffer)
    (set-visited-file-name nil)
    (rename-buffer bufname)))

Esto parece mucho más complicado de lo necesario, ya que tenemos que ocuparnos tanto del archivo visitado como del nombre del búfer, y no podemos estar seguros de que no olvidamos nada más.

Otras soluciones que implican copiar el texto del búfer en un nuevo búfer, luego guardar y eliminar ese búfer probablemente funcionaría mejor, pero entonces me preocuparían los problemas de rendimiento con los búferes grandes.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.