Напишіть власну функцію для dired-initial-position-hook
. У цій функції ви можете використовувати різні функціоновані функції для пошуку файлів, а в кінцевому підсумку зателефонуйте, dired-goto-file
щоб перейти до «найкращого» файлу:
(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)
Далі я поясню конкретні аспекти цієї функції та висвітлюю потенційні розширення.
Перехід до файлів
dired-goto-file
повертається, nil
якщо файл не існує в поточному набраному буфері, тому його можна зателефонувати без попередньої перевірки. Однак dired-goto-file
потрібне абсолютне ім'я файлу (воно помилки щодо відносних імен), отже expand-file-name
.
Пошук файлів
Dired не забезпечує прямий API для пошуку файлів. Як правило, ви можете перебирати всі файли так само, як ітерацію всіх рядків у буфері:
(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
;; …
)
Однак зручніше використовувати функції маркування. Просто потурбуйтеся про використання незвичних символів маркера, щоб не втрачати існуючі інтерактивні позначки:
(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))
Зберегти режим місця
Ви також повинні бути обережними щодо режиму збереження місця, якщо ви його ввімкнули. У режимі "Подвійні буфери" режим збереження місця не запам'ятовує значення точки, як в інших режимах, а скоріше було включено точку імені останнього файлу. Він відновлює це ім'я файлу так само, як і ми: він підключається dired-initial-position-hook
і дзвонить dired-goto-file
(насправді саме там я вкрав цей код :).
Якщо наш гачок вийде до місця збереження, режим збереження місця безумовно замінить нашу позицію. Однак, якщо він постане перед нашим гаком (як це відбувається, коли зберегти місце місце після встановлення цього гака), наша функція насправді перезаписать місце збереження, що не бажано. Однак, як і в будь-якому буфері, Save Place встановлює локальну змінну save-place
не-нульовим значенням, тому ми можемо просто перевірити, що і тільки діяти Save Place не відновив ім’я файлу.
Якщо ви хочете скористатися "Місцем збереження", зніміть чек save-place
і переконайтеся, що наш гак запущений після " Зберегти місце", включивши спершу режим збереження місця , а потім зателефонувавши add-hook
зі своїм значенням, що не має нульового значення для його APPEND
аргументу.
bound-and-true-p
. :-)