TL; DR : Якщо find-file-noselect
ви не маєте контролю над тим, що насправді відбувається, і ви можете закінчити довільні незначні режими, що включаються в буфер, залежно від того, що користувач включив у них init.el
. Також очищення важке.
Використовуйте with-temp-buffer
і insert-file-contents
замість цього. Якщо вам потрібні конкретні основні або другорядні режими в буфері, ввімкніть їх явно . Щоб писати файли, використовуйте with-temp-file
натомість, що, незважаючи на його ім'я, дозволяє записувати до довільних файлів.
Побічні ефекти
find-file-noselect
має безліч побічних ефектів, в тому числі
- інтерактивно задаючи питання (що одне лише не входить в інтерактивне використання),
- автоматично вмикаючи режим перегляду для файлів, що читаються тільки,
- в іншому режимі,
- і біг
find-file-hook
.
Сам звичайний режим
- автоматично вибирає належний основний режим для поточного буфера,
- запускає всі відповідні гачки головного та другорядного режиму,
- і зчитує всі локальні змінні поточного буфера, тобто файлові змінні та змінні каталогів, які знову можуть задавати інтерактивні запитання щодо небезпечних локальних змінних.
Оскільки всі гачки запущені, ви отримуєте всі незначні режими та функції гака, увімкнені користувачем init.el
, які можуть спричинити все, від незначних незручностей (якщо небажані незначні режими включені) до великих пошкоджень (якщо користувач додав функцію гака, яка розраховує на називатися з інтерактивного контексту).
Див. Https://github.com/flycheck/flycheck/isissue/366 для прикладу. Використання find-file-noselect
спричиненого файлом даних було перевірено синтаксисом Flycheck, і оскільки це відбувалося під час вимкнення Emacs, не було часу знову правильно очистити, залишивши тимчасовий файл позаду.
Прибирати
З find-file-noselect
вами потрібно бути особливо обережним, щоб знову вбити буфер. find-file-noselect
це не робить для вас.
Вам потрібно запам’ятати буфер в якомусь місці та обережно використовувати, unwind-protect
щоб переконатися, що буфер загине навіть у випадку немісцевих виходів.
Альтернативи
Щоб читати файли, використовуйте with-temp-buffer
та insert-file-contents
, що виконує лише найосновніші речі, наприклад, перетворення системи кодування, але не задає питань, не вмикайте гачки чи налаштовуйте локальні змінні:
(with-temp-buffer
(insert-file-contents (locate-user-emacs-file "foo.el"))
;; Enter the major mode explicitly
(emacs-lisp-mode)
;; …
)
with-temp-buffer
дбає про те, щоб належним чином вбити тимчасовий буфер в кінці його тіла.
Для запису файлів використовуйте with-temp-file
, який створює тимчасовий буфер і записує вміст у вказане ім'я файлу в кінці його тіла:
(with-temp-file (locate-user-emacs-file "foo.el")
(prin1 (list 'my 'data) (current-buffer)))
good-practices
раніше тегів не було ; чи корисно це використовувати?