En búferes dired, coloque el punto en el archivo más importante de ese directorio

Pregunta:

El 90% de las veces que visito un directorio en Emacs, lo primero que hago es mover el cursor a un archivo específico y abrirlo. Muchas veces, el archivo que necesito abrir es muy predecible. Por ejemplo:

  • Si hay archivos .tex en este directorio, normalmente voy directamente a master.tex .
  • En la raíz de los proyectos de Android, suele ser AndroidManifest.xml .
  • En un directorio donde desarrollo un paquete emacs, casi siempre es el archivo fuente principal del paquete. Por lo general, pero no siempre, es el único archivo .el en este directorio.

¿Hay alguna manera de que pueda hacer que dired coloque un punto automáticamente en estos archivos cuando abro estos directorios?

Esto ofrecería mucha conveniencia (ya que podría abrirlos con solo presionar RET ), pero aún me daría la flexibilidad de visitar otros archivos.

Respuesta:

Escriba una función personalizada para dired-initial-position-hook . En esta función, puede usar varias funciones dired para buscar archivos y, finalmente, llamar a 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 destacaré las posibles extensiones.

Saltar a archivos

dired-goto-file devuelve nil si el archivo no existe en el búfer de dired actual, por lo que es seguro llamar sin verificación previa. Sin embargo, dired-goto-file requiere un nombre de archivo absoluto (tiene errores en los nombres relativos), por lo tanto, expand-file-name .

Buscando archivos

Dired no proporciona una API sencilla para buscar archivos. Generalmente, puede iterar sobre todos los archivos como lo harí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 utilizar las funciones de marcado. Solo tenga cuidado de utilizar caracteres de marcador "inusuales" 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 el modo Guardar lugar, en caso de que lo haya habilitado. En los búferes de 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 engancha en dired-initial-position-hook y llama a dired-goto-file (de hecho, ahí es donde robé ese código :)).

Si nuestro gancho viene antes del lugar de guardado, el modo Guardar lugar sobrescribirá incondicionalmente nuestra posición. Sin embargo, si viene antes de nuestro gancho (como es el caso cuando se habilita Guardar lugar después de configurar este gancho), nuestra función sobrescribiría Guardar lugar, lo cual no es deseable. Sin embargo, como en cualquier búfer, Save Place establece la variable local save-place en un valor que no sea nulo, por lo que podemos simplemente verificar eso y solo actuar. Save Place no restauró un nombre de archivo.

Si prefiere que Save Place esté "suelto", elimine la marca de save-place y asegúrese de que nuestro gancho se ejecute después de Save Place, habilitando primero el modo Save Place y luego llamando a add-hook con un valor no nulo valor para su argumento APPEND .

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım