Scrivi una funzione personalizzata per dired-initial-position-hook
. In questa funzione è possibile utilizzare varie funzioni dirette per cercare file ed eventualmente chiamare dired-goto-file
per spostare il punto sul file "migliore":
(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)
Di seguito spiegherò aspetti specifici di questa funzione ed evidenzierò potenziali estensioni.
Saltare ai file
dired-goto-file
ritorna nil
se il file non esiste nel buffer diretto corrente, quindi è sicuro chiamare senza controllo preventivo. Tuttavia dired-goto-file
richiede un nome file assoluto (errori sui nomi relativi), quindi expand-file-name
.
Ricerca di file
Dired non fornisce un'API diretta per la ricerca di file. In generale, puoi iterare su tutti i file proprio come faresti su tutte le righe di un 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
;; …
)
Tuttavia, è più comodo utilizzare le funzioni di marcatura. Basta fare attenzione a usare un marcatore "insolito" per non perdere i segni interattivi esistenti:
(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))
Salva modalità luogo
È inoltre necessario prestare attenzione per quanto riguarda la modalità Salva luogo, nel caso in cui sia stata abilitata. Nei buffer Dired, la modalità Salva luogo non ricorda il valore del punto come in altre modalità, ma era attivo l'ultimo punto del nome file. Ripristina questo nome di file proprio come facciamo noi: si aggancia dired-initial-position-hook
e chiama dired-goto-file
(in effetti è lì che ho rubato quel codice :)).
Se il nostro hook viene prima del salvataggio del luogo, la modalità Salva luogo sovrascriverà incondizionatamente la nostra posizione. Tuttavia, se viene prima del nostro hook (come nel caso in cui Save Place è abilitato dopo aver configurato questo hook), la nostra funzione sovrascriverà effettivamente Save Place che non è desiderabile. Tuttavia, come in qualsiasi buffer, Save Place imposta la variabile locale save-place
su un valore diverso da zero, quindi possiamo semplicemente controllarlo e agire solo Save Place non ha ripristinato un nome di file.
Se preferisci che Save Place sia “loose”, rimuovi il segno di spunta save-place
e assicurati che il nostro hook sia eseguito dopo Save Place, abilitando prima la modalità Save Place e quindi chiamando add-hook
con un valore diverso da zero per l' APPEND
argomento.
bound-and-true-p
. :-)