Написать пользовательскую функцию для 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, поэтому безопасно вызывать без предварительной проверки. Однако 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 в режиме сохранения места не запоминается значение точки, как в других режимах, а включается последняя точка имени файла. Он восстанавливает это имя файла так же, как мы делаем: он подключается dired-initial-position-hook
и вызывает dired-goto-file
(на самом деле, это то, откуда я украл этот код :)).
Если наш хук предшествует сохранению, режим сохранения места безоговорочно перезапишет нашу позицию. Однако, если он предшествует нашей ловушке (как в случае, когда после установки этой ловушки активируется Save Place), наша функция фактически перезаписывает Save Place, что нежелательно. Однако, как и в любом буфере, Save Place устанавливает для локальной переменной save-place
значение, отличное от nil, поэтому мы можем просто проверить это и только действовать, Save Place не восстанавливает имя файла.
Если вы предпочитаете, чтобы «Место сохранения» было «незакрепленным», снимите флажок save-place
и убедитесь, что наш хук запускается после « Сохранить место», сначала включив режим «Сохранить место» , а затем вызвав значение add-hook
с ненулевым значением для его APPEND
аргумента.
bound-and-true-p
. :-)