Dalam jawaban terakhir oleh lunaryorn , dia menyatakan:
Namun, saya akan merekomendasikan terhadap sebagian besar bagian lain dari Org, karena alasan yang sudah dinyatakan dalam komentar: Ini sudah tua, dan penuh dengan warisan dan praktik yang berbahaya (mis. Find-file-noselect untuk membaca file secara non-interaktif).
Adakah yang bisa menjelaskan mengapa find-file-noselect
ide buruk untuk membaca file di program Elisp? Apakah ada cara yang lebih baik? Saya bertanya karena saya berpikir untuk menggunakannya di salah satu proyek saya.
good-practices
tag sebelumnya; apakah itu ide yang bagus untuk menggunakannya?good-practices
akan jatuh di bawah kategori "meta tag," yang disukai oleh SE.Jawaban:
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 dalamnyainit.el
. Juga, pembersihan itu sulit.Gunakan
with-temp-buffer
daninsert-file-contents
sebagai gantinya. Jika Anda memerlukan mode utama atau minor tertentu dalam buffer, aktifkan secara eksplisit . Untuk menulis file, gunakanwith-temp-file
sebaliknya, yang — meski namanya — memungkinkan Anda menulis ke file sewenang-wenang.Efek samping
find-file-noselect
memiliki banyak efek samping, termasukfind-file-hook
.Mode Normal itu sendiri
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
daninsert-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
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:sumber
Dari bagian 24.3 dalam manual Elisp:
Mencari dokumentasi Elisp untuk
find-file-noselect
itu jelas bahwa ia melakukan lebih dari sekadar membaca file ke buffer. Mungkin orang yang berpikir menggunakan fungsi ini adalah ide buruk yang berpikir tentang efek samping yang mungkin tidak diinginkan? Saya kira itu tergantung pada apa yang ingin Anda capai. Jika Anda ingin memiliki konten penyangga bersih / tersentuh mungkin, mungkin ide yang baik untuk menggunakan yang lama dan terpercayawith-temp-buffer
+insert-file-contents
kombinasi. Jika Anda ingin isi buffer untuk menjadi seperti dekat dengan apa yangfind-file
menghasilkan, mungkin Anda lakukan ingin digunakanfind-file-noselect
? Atau mungkin dia sedang memikirkanfind-file
;)sumber
find-file
prosesnya.