Écrivez une fonction personnalisée pour dired-initial-position-hook
. Dans cette fonction, vous pouvez utiliser diverses fonctions dirigées pour rechercher des fichiers, et éventuellement appeler dired-goto-file
pour déplacer le point vers le «meilleur» fichier:
(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)
Dans ce qui suit, je vais expliquer les aspects spécifiques de cette fonction et souligner les extensions potentielles.
Saut vers des fichiers
dired-goto-file
renvoie nil
si le fichier n'existe pas dans le tampon dired actuel, il est donc sûr d'appeler sans vérification préalable. Cependant, dired-goto-file
nécessite un nom de fichier absolu (il erreur sur les noms relatifs), par conséquent expand-file-name
.
Recherche de fichiers
Dired ne fournit pas d'API simple pour rechercher des fichiers. En règle générale, vous pouvez parcourir tous les fichiers comme vous le feriez sur toutes les lignes d'un tampon:
(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
;; …
)
Cependant, il est plus pratique d'utiliser les fonctions de marquage. Veillez simplement à utiliser un marqueur «inhabituel» pour ne pas perdre les marques interactives existantes:
(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))
Enregistrer le mode Place
Vous devez également faire attention au mode Save Place, au cas où vous l'auriez activé. Dans les tampons fatigués, le mode Save Place ne se souvient pas de la valeur du point comme dans les autres modes, mais plutôt le dernier point de nom de fichier était activé. Il restaure ce nom de fichier comme nous le faisons: il se connecte dired-initial-position-hook
et appelle dired-goto-file
(en fait, c'est là que j'ai volé ce code :)).
Si notre crochet vient avant la sauvegarde de la place, le mode sauvegarde de la place écrasera sans condition notre position. Cependant, si elle vient avant notre hook (comme c'est le cas lorsque Save Place est activé après avoir configuré ce hook), notre fonction écraserait réellement Save Place, ce qui n'est pas souhaitable. Cependant, comme dans tout tampon, Save Place définit la variable locale save-place
sur une valeur non nulle, de sorte que nous pouvons simplement vérifier cela et ne l'activer que Save Place n'a pas restauré de nom de fichier.
Si vous préférez que Save Place soit "lâche", supprimez la coche save-place
et assurez-vous que notre hook est exécuté après Save Place, en activant d' abord le mode Save Place , puis en appelant add-hook
avec une valeur non nulle pour son APPEND
argument.
bound-and-true-p
. :-)