Escribe una función personalizada para dired-initial-position-hook
. En esta función, puede usar varias funciones directas para buscar archivos y, finalmente, llamar dired-goto-file
para mover el punto al archivo "mejor":
(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)
A continuación explicaré aspectos específicos de esta función y resaltaré posibles extensiones.
Saltando a los archivos
dired-goto-file
devuelve nil
si el archivo no existe en el búfer dired actual, por lo que es seguro llamar sin verificación previa. Sin embargo, dired-goto-file
requiere un nombre de archivo absoluto (errores en nombres relativos), por lo tanto expand-file-name
.
Buscando archivos
Dired no proporciona una API sencilla para buscar archivos. En general, puede iterar sobre todos los archivos al igual que iteraría sobre todas las líneas en un búfer:
(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
;; …
)
Sin embargo, es más conveniente usar las funciones de marcado. Solo tenga cuidado de usar un marcador "inusual" para no perder las marcas interactivas existentes:
(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))
Modo Guardar lugar
También debe tener cuidado con respecto al modo Guardar lugar, en caso de que lo haya habilitado. En los buffers Dired, el modo Guardar lugar no recuerda el valor del punto como en otros modos, sino que el último punto del nombre del archivo estaba activado. Restaura este nombre de archivo tal como lo hacemos nosotros: se conecta dired-initial-position-hook
y llama dired-goto-file
(de hecho, ahí es donde robé ese código :)).
Si nuestro gancho viene antes de guardar el lugar, el modo Guardar lugar sobrescribirá incondicionalmente nuestra posición. Sin embargo, si viene antes de nuestro enlace (como es el caso cuando Save Place está habilitado después de configurar este enlace), nuestra función en realidad sobrescribiría Save Place, lo que no es deseable. Sin embargo, como en cualquier búfer, Save Place establece la variable local save-place
en un valor no nulo, por lo que simplemente podemos verificar eso y solo actuarlo. Save Place no restauró un nombre de archivo.
Si prefiere que Save Place esté "suelto", elimine la save-place
marca y asegúrese de que nuestro enlace se ejecuta después de Save Place, habilitando primero el Modo Guardar lugar y luego llamando add-hook
con un valor no nulo para su APPEND
argumento.
bound-and-true-p
. :-)