TL; DR : Dengan find-file-noselect
Anda 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-buffer
dan insert-file-contents
sebagai gantinya. Jika Anda memerlukan mode utama atau minor tertentu dalam buffer, aktifkan secara eksplisit . Untuk menulis file, gunakan with-temp-file
sebaliknya, yang — meski namanya — memungkinkan Anda menulis ke file sewenang-wenang.
Efek samping
find-file-noselect
memiliki 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.el
dalamnya, 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-noselect
file 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-noselect
Anda harus ekstra hati-hati untuk membunuh buffer lagi. find-file-noselect
tidak melakukan itu untukmu.
Anda perlu mengingat buffer di suatu tempat, dan gunakan dengan hati-hati unwind-protect
untuk memastikan bahwa buffer terbunuh bahkan dalam kasus keluar non-lokal.
Alternatif
Untuk membaca file, gunakan with-temp-buffer
dan 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-practices
tag sebelumnya; apakah itu ide yang bagus untuk menggunakannya?