В недавнем ответе по lunaryorn , он заявил:
Однако я рекомендовал бы против большинства других частей Org, по причинам, уже указанным в комментариях: он старый и полон устаревших и вредных методов (например, find-file-noselect для чтения файлов неинтерактивно).
Кто-нибудь может объяснить, почему find-file-noselect
плохая идея читать файлы в программах Elisp? Есть ли способ лучше? Я спрашиваю, потому что я думал об использовании его в одном из моих проектов.
good-practices
раньше тега не было; это хорошая идея, чтобы использовать его?good-practices
это подпадает под категорию «метатег», который осуждается SE.Ответы:
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/issues/366 для примера. В результате использования
find-file-noselect
файла Flycheck была проверена синтаксическая проверка файла данных, и, поскольку это происходило при завершении работы Emacs, не было времени для правильной очистки, оставив временный файл.уборка
С
find-file-noselect
вами нужно быть очень осторожным, чтобы снова убить буфер.find-file-noselect
не делает это для вас.Вам нужно запомнить буфер в каком-то месте и тщательно использовать
unwind-protect
его, чтобы убедиться, что буфер уничтожен даже в случае нелокальных выходов.альтернативы
Для чтения файлов используйте
with-temp-buffer
иinsert-file-contents
, который выполняет только самые простые действия, например, преобразование системы кодирования, но не задает вопросов, не включает хуки и не устанавливает локальные переменные:with-temp-buffer
заботится, чтобы правильно убить временный буфер в конце его тела.Для записи файлов используйте
with-temp-file
команду, которая создает временный буфер и записывает содержимое в указанное имя файла в конце его тела:источник
Из раздела 24.3 руководства Elisp:
При поиске документации Elisp
find-file-noselect
очевидно, что она делает гораздо больше, чем просто читает файл в буфер. Возможно, люди, которые считают использование этой функции плохой идеей, думают о, возможно, нежелательных побочных эффектах? Я думаю, это зависит от того, чего вы хотите достичь. Если вы хотите иметь как можно более чистое / нетронутое содержимое буфера, было бы неплохо использовать старую и надежную комбинациюwith-temp-buffer
+insert-file-contents
. Если вы хотите , чтобы содержимое буфера , чтобы быть как можно ближе к тому , чтоfind-file
производить, возможно , вы действительно хотите использоватьfind-file-noselect
? Или, возможно, он думал оfind-file
;)источник
find-file
процесс.