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раніше тегів не було ; чи корисно це використовувати?