TL; DR : Dengan find-file-noselectAnda tidak memiliki kendali tentang apa yang sebenarnya terjadi, dan Anda dapat berakhir dengan mode minor sembarang yang diaktifkan di buffer, tergantung pada apa yang diaktifkan pengguna di dalamnya init.el. Juga, pembersihan itu sulit.
Gunakan with-temp-bufferdan insert-file-contentssebagai gantinya. Jika Anda memerlukan mode utama atau minor tertentu dalam buffer, aktifkan secara eksplisit . Untuk menulis file, gunakan with-temp-filesebaliknya, yang — meski namanya — memungkinkan Anda menulis ke file sewenang-wenang.
Efek samping
find-file-noselectmemiliki banyak efek samping, termasuk
- mengajukan pertanyaan secara interaktif (itu saja tidak boleh digunakan non-interaktif),
- secara otomatis mengaktifkan mode tampilan untuk file hanya baca,
- memasuki mode normal jika tidak,
- dan berlari
find-file-hook.
Mode Normal itu sendiri
- secara otomatis memilih mode utama yang tepat untuk buffer saat ini,
- menjalankan semua mode kait utama dan minor yang sesuai,
- dan membaca semua variabel lokal untuk buffer saat ini, yaitu variabel file dan variabel direktori, yang lagi-lagi dapat mengajukan pertanyaan interaktif tentang variabel lokal yang tidak aman.
Karena semua kait dijalankan, Anda mendapatkan semua mode minor dan fungsi kait yang diaktifkan pengguna di init.eldalamnya, yang dapat menyebabkan semuanya, mulai dari ketidaknyamanan kecil (jika mode minor yang tidak diinginkan diaktifkan) hingga kekacauan besar (jika pengguna menambahkan fungsi kait yang berharap untuk dipanggil dari konteks interaktif).
Lihat https://github.com/flycheck/flycheck/issues/366 untuk contoh. Penggunaan find-file-noselectfile data menyebabkan sintaks-diperiksa oleh Flycheck, dan karena itu terjadi di Emacs shut-down, tidak ada waktu untuk membersihkan dengan baik lagi, meninggalkan file sementara di belakang.
Membersihkan
Dengan find-file-noselectAnda harus ekstra hati-hati untuk membunuh buffer lagi. find-file-noselecttidak melakukan itu untukmu.
Anda perlu mengingat buffer di suatu tempat, dan gunakan dengan hati-hati unwind-protectuntuk memastikan bahwa buffer terbunuh bahkan dalam kasus keluar non-lokal.
Alternatif
Untuk membaca file, gunakan with-temp-bufferdan insert-file-contents, yang hanya melakukan hal-hal paling mendasar, misalnya mengkode konversi sistem, tetapi tidak mengajukan pertanyaan, mengaktifkan kait, atau mengatur variabel lokal:
(with-temp-buffer
(insert-file-contents (locate-user-emacs-file "foo.el"))
;; Enter the major mode explicitly
(emacs-lisp-mode)
;; …
)
with-temp-buffer berhati-hati untuk membunuh buffer sementara di ujung tubuhnya.
Untuk menulis file, gunakan with-temp-file, yang membuat buffer sementara dan menulis konten ke nama file yang diberikan di akhir tubuhnya:
(with-temp-file (locate-user-emacs-file "foo.el")
(prin1 (list 'my 'data) (current-buffer)))
good-practicestag sebelumnya; apakah itu ide yang bagus untuk menggunakannya?