Escreva uma função personalizada para dired-initial-position-hook
. Nesta função, você pode usar várias funções direcionadas para procurar arquivos e, eventualmente, chamar dired-goto-file
para mover o ponto para o "melhor" arquivo:
(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 seguir, explicarei aspectos específicos dessa função e destacarei as possíveis extensões.
Saltando para arquivos
dired-goto-file
retorna nil
se o arquivo não existir no buffer direcionado atual; portanto, é seguro chamar sem verificação prévia. No entanto, dired-goto-file
requer um nome de arquivo absoluto (erros em nomes relativos), portanto expand-file-name
.
Procurando por Arquivos
Dired não fornece uma API direta para procurar arquivos. Geralmente, você pode iterar sobre todos os arquivos da mesma forma que iterava sobre todas as linhas em um 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
;; …
)
No entanto, é mais conveniente usar as funções de marcação. Apenas tome cuidado para usar caracteres marcadores "incomuns", para não perder as marcas interativas 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 Salvar local
Você também precisa ter cuidado com o Modo Salvar local, caso o tenha ativado. Nos buffers Dired, o Modo Salvar local não lembra o valor do ponto como em outros modos, mas o último ponto do nome do arquivo estava ativado. Ele restaura esse nome de arquivo, da mesma forma que fazemos: Ele se conecta dired-initial-position-hook
e chama dired-goto-file
(de fato, foi daí que roubei esse código :).
Se nosso gancho vier antes de salvar o local, o Modo Salvar Local substituirá incondicionalmente nossa posição. No entanto, se vier antes do nosso gancho (como é o caso quando o Save Place é ativado após a configuração deste gancho), nossa função substituirá o Save Place, o que não é desejável. No entanto, como em qualquer buffer, o Save Place define a variável local save-place
como um valor não nulo; portanto, podemos simplesmente verificar isso e apenas agir como o Save Place não restaurou um nome de arquivo.
Se você preferir que o Save Place seja “solto”, remova a verificação save-place
e certifique-se de que nosso gancho seja executado após o Save Place, ativando o Modo Save Place primeiro e depois chamando add-hook
com um valor não nulo para o APPEND
argumento.
bound-and-true-p
. :-)