¿Obtener enlace de organización para insertar la descripción del enlace automáticamente?

11

P: ¿Cómo puedo obtener una orgfunción de enlace personalizado para insertar una descripción automáticamente?

Me gustaría almacenar orgenlaces a archivos en un diredbúfer, pero preferiría que la descripción del enlace sea el nombre del archivo sin ruta en lugar de informar la ruta completa, es decir:

file:~/the/full/path/myfile.ext     ; default, but no thanks
myfile.ext                          ; what I want

Ahora: org-store-linkcodifica los enlaces desde diredpara proporcionar el valor predeterminado. En cambio, he escrito una función personalizada (anulación de la función codificada) y la agregué a org-store-link-functions:

(defun dired-store-link ()
  (when (derived-mode-p 'dired-mode)
    (let ((file (dired-get-filename nil t)))
      (setf file (if file
                     (abbreviate-file-name (expand-file-name file))
                   default-directory))
      (org-store-link-props :type        "dired"
                            :link        file
                            :description (file-name-nondirectory file))
      file)))

(add-to-list 'org-store-link-functions #'dired-store-link)

Hasta ahora todo bien, y funciona como se esperaba, pero para empezar:

  • Cuando se llama org-insert-linkcon el comportamiento predeterminado incorporado, simplemente inserta el enlace sin pedirme una descripción.
  • Cuando llamo org-insert-linkcon mi función personalizada, me pide que ingrese una descripción (que se completa correctamente con el nombre del archivo almacenado en la :descriptionpropiedad).

Prefiero que no me soliciten la descripción cada vez, y quiero org-insert-linkusar el valor :descriptionque establece la función personalizada.

¿Cómo puedo convencer org-insert-linkpara usar el :descriptionautomáticamente sin preguntarme?

Dan
fuente
¿ Ayudan los argumentos opcionales link-locationo default-descriptionen la función org-insert-link? Si el parámetro LINK-LOCATION no es nulo, este valor se usará como ubicación del enlace en lugar de leer uno de forma interactiva. Si el parámetro DEFAULT-DESCRIPTION no es nulo, este valor se usará como la descripción predeterminada.
abogados
@lawlist: gracias por la sugerencia, aunque no estoy seguro de cómo configurarlo en uso interactivo sin envolverlo en otra función. Sin embargo, me hizo leer la cadena de documentos más de cerca, lo que me llevó a una especie de respuesta.
Dan

Respuestas:

4

Enterrado en la parte inferior de la cadena de documentos org-insert-linkhay una nota que:

Si org-make-link-description-functionno es nulo, se llamará a esta función con el destino del enlace, y el resultado será la descripción predeterminada del enlace.

Aparentemente orgarroja mucha información en el proceso de almacenamiento de un enlace, por lo que todo lo que queda org-stored-linkses una lista de entradas del formulario (link description). En la medida en que la función anterior tiene un nombre de archivo para el enlace, parece que funciona de la siguiente manera:

(defun org-link-describe (link desc)
  (if (file-exists-p link)
      desc
    (read-string "Description: " desc)))

(setf org-make-link-description-function #'org-link-describe)

Es un poco hacky, y no lo he probado exhaustivamente, pero parece funcionar hasta ahora. Estaría encantado de ver una solución más elegante, por supuesto.

Dan
fuente
2
Ahora que conoce esta función, ¿no puede deshacerse de ella dired-store-linky simplemente usarla para crear la descripción que desea? Creo que eso terminaría mucho más corto.
Malabarba
1
@Malabarba: probablemente tenga razón: esta función podría reescribirse para inspeccionar el enlace de un archivo y proceder en consecuencia. Lo probaré cuando tenga un momento libre.
Dan
3

Estoy usando org 9.1.6, y para mi consternación parece que org-store-link-functionsahora es una función de organización integrada (en lugar de un enlace), por lo que la solución original ya no funciona. Puede haber una solución alternativa usando org-link-parameters, pero en su lugar estoy usando el siguiente pequeño truco, que parece ser el truco:

(defun my//dired-store-link (orig-fun &rest args)
  (if (derived-mode-p 'dired-mode)
      (let ((file (dired-get-filename nil t)))
        (setf file (if file
                       (abbreviate-file-name (expand-file-name file))
                     default-directory))
        (let ((link (concat "file:" file))
              (desc (file-name-nondirectory file)))
          (push (list link desc) org-stored-links)
          (car org-stored-links)))
    (apply orig-fun args)))
(advice-add 'org-store-link :around #'my//dired-store-link)

Como beneficio adicional, esto no solicita una descripción, ya que la descripción enviada org-stored-linksno es nula.

Matt Kramer
fuente