Tulis fungsi khusus untuk dired-initial-position-hook
. Dalam fungsi ini Anda dapat menggunakan berbagai fungsi dired untuk mencari file, dan akhirnya memanggil dired-goto-file
untuk memindahkan titik ke file "terbaik":
(defun my-dired-goto-important-file ()
"Go to an important file in the current dired buffer."
(unless (bound-and-true-p save-place)
(let ((candidates '("master.tex" "AndroidManifest.xml"))
candidate)
(while (and candidates
(not (dired-goto-file (expand-file-name (pop candidates)))))
nil))))
(add-hook 'dired-initial-position-hook #'my-dired-goto-important-file)
Berikut ini saya akan menjelaskan aspek spesifik dari fungsi ini, dan menyoroti ekstensi potensial.
Melompat ke file
dired-goto-file
kembali nil
jika file tidak ada di buffer dired saat ini, jadi aman untuk memanggil tanpa memeriksa sebelumnya. Namun dired-goto-file
membutuhkan nama file absolut (kesalahan pada nama relatif), karenanya expand-file-name
.
Mencari file
Dired tidak menyediakan API langsung untuk mencari file. Secara umum, Anda dapat mengulangi semua file seperti halnya Anda mengulangi semua baris dalam buffer:
(let (files)
(goto-char (point-min))
(while (not (eobp))
(let ((filename (dired-get-filename nil 'no-error)))
(when filename
(push filename files)))
(forward-line 1))
;; Now `files' is a list of files, which you can search for patterns
;; …
)
Namun, lebih nyaman menggunakan fungsi menandai. Berhati-hatilah untuk menggunakan karakter marker "tidak biasa", agar tidak kehilangan tanda interaktif yang ada:
(unwind-protect
(when (dired-mark-files-regexp (rx ".tex" string-end) ?t)
(dired-goto-file (expand-file-name "master.tex")))
(dired-unmark-all-files ?t))
Simpan Mode Tempat
Anda juga harus berhati-hati terkait dengan Mode Simpan Tempat, jika Anda mengaktifkannya. Di buffer Dired, Mode Simpan Tempat tidak mengingat nilai poin seperti pada mode lain, melainkan titik nama file terakhir aktif. Ini mengembalikan nama file ini seperti yang kita lakukan: Ini menghubungkan dired-initial-position-hook
dan memanggil dired-goto-file
(pada kenyataannya, di situlah saya mencuri kode itu dari :)).
Jika hook kami datang sebelum save place, Save Place Mode tanpa syarat akan menimpa posisi kami. Namun, jika itu datang sebelum hook kami (seperti halnya ketika Save Place diaktifkan setelah Anda mengatur hook ini) fungsi kami sebenarnya akan menimpa Save Place yang tidak diinginkan. Namun, seperti pada buffer apa pun, Save Place menetapkan variabel lokal save-place
ke nilai non-nil, jadi kami cukup memeriksanya dan hanya bertindak itu Save Place tidak mengembalikan nama file.
Jika Anda lebih suka memiliki Simpan Tempat "longgar", hapus tanda centang untuk save-place
, dan pastikan bahwa kait kami dijalankan setelah Simpan Tempat, dengan mengaktifkan Simpan Tempat Mode terlebih dahulu , dan kemudian memanggil add-hook
dengan nilai nihil untuk APPEND
argumennya.
bound-and-true-p
. :-)