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
(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
以前はタグがなかったようです。それを使うのは良い考えですか?