Saya ingin memeriksa apakah beberapa (misalnya, saat ini) buffer mengunjungi file atau tidak. Saya bisa mengatakan:
(if (buffer-file-name) ...)
tetapi tampaknya tidak terlalu elegan - yang saya tertarik hanyalah nilai boolean, bukan nama sebenarnya dari buffer yang dimaksud. Jika buffer-file-name
fungsi tersebut ditulis dalam Elisp, saya dapat melihat ke sumbernya untuk mengetahui apa yang digunakan - tetapi ditulis dalam C, dan sementara saya dapat menginstal sumber Emacs, saya takut bahwa saya tidak akan menemukan nama elisp untuk fungsi yang memeriksa apa yang saya cari setelah itu.
Yang saya butuhkan adalah saya ingin membuat direktori berdasarkan nama file buffer saat ini, dan saat ini saya melakukan lebih atau kurang ini:
(make-directory (if (buffer-file-name) (file-name-base) "default-dir"))
Jadi, apa cara Elisp-idiomatis untuk melakukan ini?
buffer-file-name
benar - benar, itu cara yang tepat untuk melakukannya (jika Anda benar-benar ingint
, lakukan(and (buffer-file-name) t)
tapi itu IMO lebih buruk). Implementasinya adalah membacafilename
bidang buffer C struct, yang toh tidak dapat diakses langsung dari Elisp. Pada akhirnya, itu hanya sebuah pointer yang bernilai null atau tidak.(and (buffer-file-name) t)
terlihat aneh.(if (buffer-file-name) ... )
elegan, maka Anda belum lama mengkode di elisp. Hanya mendapat lebih buruk dari sini.Jawaban:
Saya berpendapat bahwa penggunaan Anda adalah idiot elisp, karena nama buffer adalah nilai boolean yang sangat tepat. Mengutip dari manual :
Untuk lebih lanjut, lihat kode untuk
clone-buffer
. Saya berharap Anda akan melihat yang berikut:Perhatikan bahwa ini sedang menguji pengikatan variabel
buffer-file-name
alih - alih memanggil fungsi tanpa argumen(buffer-file-name)
,, tetapi keduanya harus selalu berperilaku sama.sumber
Anda dapat menggunakan
(buffer-file-name)
(dengan argumen buffer opsional) ataubuffer-file-name
variabel buffer-local . Keduanya mengevaluasi dengan nilai yang sama untuk buffer yang diberikan.Itu adalah cara idiomatis untuk melakukan ini di Elisp, jadi kode Anda baik-baik saja. Jika Anda sangat menginginkannya, Anda selalu bisa membuat
buffer-has-file-p
fungsi pembungkus.sumber
(buffer-file-name BUFFER)
tentu saja lebih baik daripada(with-current-buffer BUFFER buffer-file-name)
, tetapi sebaliknya saya tidak berpikir itu penting yang mana yang Anda gunakan (dan karena fungsi ditulis dalam C, saya ragu bahkan ada banyak perbedaan dalam kinerja).Gunakan saja
buffer-file-name
. Dalam Lisp kita sering menggunakannil
nilai- tidak untuk berarti benar .Satu-satunya waktu Anda mungkin ingin menghindari ini adalah jika fungsinya mahal atau memiliki efek samping yang tidak diinginkan.
sumber
nil
benar itu benar, saya hanya berpikir untuk mengambil nama itu ketika saya hanya ingin tahu apakah ada nama itu "mahal" - tetapi sepertinya tidak.Dari bab "Daftar Penyangga" dokumentasi:
Jadi, Anda harus menemukan cara untuk mencari dalam daftar buffer langsung. Ini dia:
sumber