Come salvare una copia di un buffer in un file?


9

Vorrei poter salvare una copia (o un'istantanea) di un buffer in un file. Il comportamento sarebbe simile write-file, tranne per il fatto che non imposta il buffer per visitare questo file.

Per un caso d'uso, immagina di avere una sessione di shell e desideri salvarla rapidamente in un file di registro. Il buffer non deve essere rinominato (in modo che funzioni che si basano sul nome del buffer funzionino ancora) e non dovrebbe visitare un file (in modo che il file non venga sovrascritto accidentalmente e non vi siano avvisi quando si esce da emacs).

Posso immaginare alcuni modi sporchi per farlo, ne posterò uno come risposta automatica, ma leggendo dal manuale, l'intero sistema di "file visitato" è più complicato di quanto sembri, e immagino sia facile redigere un soluzione sbagliata. Esiste un modo nascosto, integrato, per raggiungere questo obiettivo?

Risposte:


18

Basta selezionare l'intero buffer ( C-x h) e usare write-region.


3
Non è necessario selezionare il testo del buffer, se si utilizza write-regionda Lisp (ad es. Con il proprio comando). Basta passarlo (point-min)e (point-max), insieme al nome del file.
Estratto il

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

Grazie per il buffer di selezione e il M-x write-regioncomando effettivo .
Grant Bowman,

0

elispFare sporco quello che voglio fare:

(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)))

Sembra molto più complicato di quanto dovrebbe essere necessario, poiché dobbiamo occuparci sia del file visitato che del nome del buffer e non possiamo essere sicuri di non aver dimenticato altro.

Altre soluzioni che coinvolgono la copia del testo del buffer in un nuovo buffer, quindi il salvataggio e l'uccisione di quel buffer probabilmente funzionerebbero meglio, ma sarei quindi preoccupato per i problemi di prestazioni con buffer di grandi dimensioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.