Insertar enlace de ID de organización en el punto mediante la finalización de la ruta del esquema

11

Actualmente para insertar enlaces internos de org-mode org-id, navego a un encabezado o lo levanto en la vista de agenda (Ca s test test search RET), almaceno el enlace con Cl (org-store-link), volviendo a donde Quiero insertar el enlace, luego insertar el enlace con Cc Cl (org-insert-link).

En cambio, preferiría asignar una clave que me permita insertar un enlace en el punto actual usando la finalización de tabulación similar a org-refile (Cc Cw). El resultado previsto sería un enlace interno org-id en la forma:

[[id:d7534b2f-c221-4dea-8566-d5ce3e4e1b78][Example Link]]

Mirando a través de org-id.el, parece que org-id-get-with-outline-path-complete fue diseñado para este propósito. Lo intenté:

(global-set-key "\C-ci" (lambda () (interactive) (org-id-get-with-outline-path-completion)))

pero no funcionó según lo previsto.

Tengo lo siguiente en mi archivo init.el:

;; Use global IDs
(require 'org-id)
(setq org-id-link-to-org-use-id t)

;; Update ID file .org-id-locations on startup
(org-id-update-id-locations)

;; Refile options
(setq org-refile-targets (quote ((nil :maxlevel . 9) (org-agenda-files :maxlevel . 9))))
(setq org-refile-use-outline-path 'file)
(setq org-outline-path-complete-in-steps t)
(setq org-refile-allow-creating-parent-nodes t)
sk8ingdom
fuente
Te estás perdiendo un "-" en org-id-get-with outline-path-completion. ¿Ese es el problema?
erikstokes
Desafortunadamente no, fue solo un error tipográfico. He actualizado la pregunta.
sk8ingdom
Demasiado. ¿Cómo está fallando? Funciona cuando lo intento.
erikstokes
La función definitivamente se llama. Me solicita la entrada, me permite navegar a través de la finalización de la pestaña (que es genial y funciona según lo previsto), pero cuando presiono enter, en lugar de pegar el enlace, simplemente mueve el cursor al título actual, similar a Cc Cu (encabezado delineado).
sk8ingdom
Pensé que esto podría haber sido causado por una versión de organización desactualizada, pero probé la más reciente en Emacs 24.5, por lo que debe ser algo en mi configuración. ¿Alguien puede confirmar que mi código anterior realmente inserta un enlace para ellos?
sk8ingdom

Respuestas:

6

Busqué en la fuente del modo org y encontré una característica mínimamente documentada . Si define una función org-TYPE-complete-link, se utilizará para completar los enlaces de tipo TYPE. Por lo tanto, solo necesitamos definir una función org-id-complete-linkque complete y devuelva el enlace (incluido el prefijo "id:").

(defun org-id-complete-link (&optional arg)
  "Create an id: link using completion"
  (concat "id:"
          (org-id-get-with-outline-path-completion)))

Inserte el enlace de la manera normal (con C-c C-l), seleccione "id:" como tipo y se activará la función de finalización.

EDITAR: a partir de la org-modeversión 9.0, solo definir la función como se mencionó anteriormente ya no funciona ( ref ). En su lugar, debe agregar la función de finalización para org-link-parametersusar

(org-link-set-parameters "id"
                         :complete 'org-id-complete-link)
erikstokes
fuente
¡Esto es excelente y funciona según lo previsto! La única modificación que hice fue agregar org-refile-objetivos como argumento para org-id-get-with-outline-path-complete. De esa manera, puedo obtener enlaces de CUALQUIERA de mis archivos de organización. ¡Gracias por tu ayuda!
sk8ingdom
@ sk8ingdom ¿Puede actualizar la pregunta para incluir su solución final? No estoy seguro de lo que el documento quiere decir conTARGETS may be a setting for ‘org-refile-targets’ to define eligible headlines.
kshenoy
La solución final es simplemente definir la función anterior y también llamar org-link-set-parameterssi está usando org-mode9. El argumento adicional para org-id-get-with-outline-path-completionpermitirle limitar los titulares de los que eligió, al igual que lo org-refile-targetshace cuando vuelve a archivar. Consulte la ayuda para todo, pero una configuración común es ((org-agenda-files :maxlevel . 3) (nil :maxlevel . 2))que limita a 3 niveles de profundidad en los archivos de agenda y 2 en el búfer actual.
erikstokes