TL; DR : Con find-file-noselect
te non hai alcun controllo su ciò che accade realmente e potresti finire con modalità secondarie arbitrarie che si abilitano nel buffer, a seconda di ciò che l'utente ha abilitato nel loro init.el
. Inoltre, la pulizia è difficile.
Usa with-temp-buffer
e insert-file-contents
invece. Se sono necessarie specifiche modalità principali o secondarie nel buffer, abilitarle esplicitamente . Per scrivere i file, utilizzare with-temp-file
invece, che, nonostante il nome, consente di scrivere su file arbitrari.
Effetti collaterali
find-file-noselect
ha molti effetti collaterali, tra cui
- porre domande interattivamente (che da solo è un non-uso in un uso non interattivo),
- abilitazione automatica della modalità di visualizzazione per file di sola lettura,
- entrare in modalità normale altrimenti,
- e in esecuzione
find-file-hook
.
Modalità normale stessa
- seleziona automaticamente una modalità principale appropriata per il buffer corrente,
- esegue tutti gli hook di modalità principale e secondaria corrispondenti,
- e legge tutte le variabili locali per il buffer corrente, vale a dire variabili di file e variabili di directory, che potrebbero porre nuovamente domande interattive su variabili locali non sicure.
Poiché tutti gli hook vengono eseguiti, ottieni tutte le modalità secondarie e le funzioni hook che l'utente ha abilitato nelle loro init.el
, il che può causare tutto, da piccoli inconvenienti (se le modalità secondarie indesiderabili sono abilitate) al caos maggiore (se l'utente ha aggiunto una funzione hook che si aspetta di essere chiamato da un contesto interattivo).
Vedere https://github.com/flycheck/flycheck/issues/366 per un esempio. L'uso di find-file-noselect
un file di dati è stato verificato da Flycheck per la verifica della sintassi e, poiché si stava verificando all'arresto di Emacs, non c'era tempo per ripulire correttamente, lasciando indietro un file temporaneo.
Pulire
Con find-file-noselect
è necessario prestare particolare attenzione a eliminare nuovamente il buffer. find-file-noselect
non lo fa per te.
È necessario ricordare il buffer in qualche punto e utilizzarlo attentamente unwind-protect
per assicurarsi che il buffer venga ucciso anche in caso di uscite non locali.
alternative
Per leggere i file, utilizzare with-temp-buffer
e insert-file-contents
, che esegue solo le operazioni di base, ad esempio la conversione del sistema di codifica, ma non fa domande, abilita hook o imposta variabili locali:
(with-temp-buffer
(insert-file-contents (locate-user-emacs-file "foo.el"))
;; Enter the major mode explicitly
(emacs-lisp-mode)
;; …
)
with-temp-buffer
si prende cura di uccidere correttamente il buffer temporaneo alla fine del suo corpo.
Per scrivere file, utilizzare with-temp-file
, che crea un buffer temporaneo e scrive il contenuto sul nome file specificato alla fine del suo corpo:
(with-temp-file (locate-user-emacs-file "foo.el")
(prin1 (list 'my 'data) (current-buffer)))
good-practices
tag prima; è una buona idea usarlo?