Sì, che è ciò che si vuole fare: visitare il file in un buffer, e operare sul testo in quel buffer.
Si non è necessario visualizzare il buffer, vale a dire, l'utente non ha bisogno di vederlo.
E per quanto riguarda l'efficienza: la manipolazione di testo in un buffer è in genere il modo efficiente più per manipolare il testo.
Si può visitare un file in un buffer in diversi modi. Potresti voler utilizzare un buffer di file esistente per questo, a seconda del caso d'uso. Cioè, se il file è già "aperto" in Emacs, potresti voler usare il suo buffer.
Oppure si potrebbe voler ignorare qualsiasi buffer di file esistente per un file già "aperto" e leggere nuovamente il file in un nuovo buffer. Per questo, come cita @Sean, puoi usare insert-file-contents
con un buffer che hai creato. È possibile creare il buffer utilizzando with-temp-buffer
o generate-new-buffer
, a seconda, ancora, su ciò che si desidera/deve fare con esso.
Se si desidera riutilizzare un buffer che sta già visitando il file, è possibile verificare se è stato modificato in memoria, se è ristretto, ecc., E fare tutto ciò che è appropriato per il proprio caso d'uso. È possibile verificare se esiste già un buffer che visita il file (utilizzando qualsiasi percorso/nome file) utilizzando la funzione find-buffer-visiting
.
Per visitare il file, sfruttando qualsiasi buffer esistente che lo sta visitando, è possibile utilizzare find-file-noselect
. Quella funzione restituisce il buffer che visita il file, quindi è possibile passare quel buffer come primo argomento a with-current-buffer
. Qui c'è un semplice esempio.
(with-current-buffer (let ((enable-local-variables ())) (find-file-noselect file))
;; Do some stuff with the text in the buffer.
;; Optionally save the buffer back to the file.
)
(il legame di enable-local-variables
-nil
è un'ottimizzazione minore, per il caso comune in cui non c'è bisogno di perdere tempo con le variabili del buffer-locale.)
Se si elabora il file riga per riga, di solito è più veloce usare 'forward-line' o' end-of-line'. – jch
Secondo la mia esperienza è un po 'difficile identificare la fine del file usando 'forward-line' e parentela se l'ultima riga può o meno terminare con una nuova riga. – Sean