TL; DR : Gdy find-file-noselect
nie masz kontroli nad tym, co się faktycznie dzieje, możesz skończyć z dowolnymi mniejszymi trybami włączającymi się w buforze, w zależności od tego, co użytkownik w nich włączył init.el
. Również czyszczenie jest trudne.
Użyj with-temp-buffer
i insert-file-contents
zamiast. Jeśli potrzebujesz określonych głównych lub mniejszych trybów w buforze, włącz je jawnie . Aby pisać pliki, użyj with-temp-file
zamiast tego, który - pomimo nazwy - pozwala pisać do dowolnych plików.
Skutki uboczne
find-file-noselect
ma wiele skutków ubocznych, w tym
- interaktywnie zadawać pytania (to samo w sobie jest nieużywane w nieinteraktywnym użyciu),
- automatyczne włączanie trybu przeglądania plików tylko do odczytu,
- wejście w tryb normalny inaczej,
- i bieganie
find-file-hook
.
Sam tryb normalny
- automatycznie wybiera odpowiedni tryb główny dla bieżącego bufora,
- uruchamia wszystkie odpowiednie zaczepy trybu głównego i pomocniczego,
- i odczytuje wszystkie zmienne lokalne dla bieżącego bufora, tj. zmienne plikowe i zmienne katalogowe, które ponownie mogą zadawać interaktywne pytania dotyczące niebezpiecznych zmiennych lokalnych.
Ponieważ wszystkie przechwytywania są uruchomione, otrzymujesz wszystkie pomniejsze tryby i funkcje przechwytujące, które użytkownik w nich uruchomił init.el
, co może powodować wszystko, od drobnych niedogodności (jeśli włączone są niepożądane tryby pomniejsze) do poważnego spustoszenia (jeśli użytkownik dodał funkcję przechwytującą, która spodziewa się być wywoływanym z kontekstu interaktywnego).
Zobacz https://github.com/flycheck/flycheck/issues/366 dla przykładu. Użycie find-file-noselect
pliku Flycheck sprawiło, że plik danych został sprawdzony pod kątem składni, a ponieważ działo się to podczas zamykania Emacsa, nie było czasu na poprawne wyczyszczenie, pozostawiając plik tymczasowy.
Sprzątać
Ze find-file-noselect
trzeba być bardzo ostrożnym, aby ponownie zabić bufor. find-file-noselect
nie robi tego dla ciebie.
Musisz pamiętać bufor w pewnym miejscu i ostrożnie go używać, unwind-protect
aby upewnić się, że bufor zostanie zabity nawet w przypadku nielokalnych wyjść.
Alternatywy
Aby odczytać pliki, użyj with-temp-buffer
i insert-file-contents
, który robi tylko najbardziej podstawowe rzeczy, np. Konwersję systemu kodowania, ale nie zadaje pytań, nie włącza haków ani nie konfiguruje zmiennych lokalnych:
(with-temp-buffer
(insert-file-contents (locate-user-emacs-file "foo.el"))
;; Enter the major mode explicitly
(emacs-lisp-mode)
;; …
)
with-temp-buffer
dba o prawidłowe zabicie tymczasowego bufora na końcu jego ciała.
Aby pisać pliki, użyj with-temp-file
, który tworzy tymczasowy bufor i zapisuje zawartość pod podaną nazwą pliku na końcu jego treści:
(with-temp-file (locate-user-emacs-file "foo.el")
(prin1 (list 'my 'data) (current-buffer)))
good-practices
tagu; czy warto go używać?