Insérer un lien org-id au point via l'achèvement du chemin de contour

11

Actuellement, pour insérer des liens org-id internes en mode org, je navigue vers une rubrique ou la tire vers le haut dans la vue de l'agenda (recherche de test de rubrique Ca RET), stocke le lien avec Cl (org-store-link), revenant à l'endroit où Je veux insérer le lien, puis insérer le lien avec Cc Cl (org-insert-link).

Au lieu de cela, je préférerais mapper une clé qui me permet d'insérer un lien au point actuel en utilisant la complétion d'onglets similaire à org-refile (Cc Cw). Le résultat souhaité serait un lien interne org-id sous la forme:

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

En parcourant org-id.el, il semble que org-id-get-with-outline-path-complètement a été conçu à cet effet. J'ai essayé:

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

mais cela n'a pas fonctionné comme prévu.

J'ai les éléments suivants dans mon fichier 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
la source
Vous manquez un "-" dans org-id-get-with outline-path-completion. Est-ce là le problème?
erikstokes
Malheureusement non - c'était juste une erreur typographique. J'ai mis à jour la question.
sk8ingdom
Dommage. Comment cela échoue-t-il? Ça marche quand je l'essaye.
erikstokes
La fonction est définitivement appelée. Il m'invite à entrer, me permet de naviguer via la complétion de l'onglet (ce qui est génial et fonctionne comme prévu), mais lorsque je clique sur Entrée, au lieu de coller le lien, il déplace simplement le curseur vers le titre actuel, similaire à Cc Cu (contour-en-tête).
sk8ingdom
Je pensais que cela pouvait être dû à une version d'organisation obsolète, mais j'ai essayé la plus récente dans Emacs 24.5, donc cela doit être quelque chose dans ma configuration. Quelqu'un peut-il confirmer que mon code ci-dessus insère réellement un lien pour eux?
sk8ingdom

Réponses:

6

J'ai fouillé dans la source en mode org et trouvé une fonctionnalité peu documentée . Si vous définissez une fonction org-TYPE-complete-link, elle sera utilisée pour fournir l'achèvement des liens de type TYPE. Il nous suffit donc de définir une fonction org-id-complete-linkqui effectue notre achèvement et renvoie le lien (y compris le préfixe "id:").

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

Insérez le lien de la manière normale (avec C-c C-l), sélectionnez "id:" car le type et la fonction d'achèvement se déclencheront.

EDIT: À partir de la org-modeversion 9.0, la simple définition de la fonction ci-dessus ne fonctionne plus ( réf ). Au lieu de cela, vous devez ajouter la fonction d'achèvement à l' org-link-parametersutilisation

(org-link-set-parameters "id"
                         :complete 'org-id-complete-link)
erikstokes
la source
C'est excellent et fonctionne comme prévu! La seule modification que j'ai apportée a été d'ajouter l'argument-refile-target comme argument à org-id-get-with-outline-path-complét. De cette façon, je peux récupérer des liens de N'IMPORTE QUEL de mes fichiers d'organisation. Merci de votre aide!
sk8ingdom
@ sk8ingdom Pouvez-vous mettre à jour la question pour inclure votre solution finale? Je ne sais pas ce que le doc veut dire parTARGETS may be a setting for ‘org-refile-targets’ to define eligible headlines.
kshenoy
La solution finale consiste simplement à définir la fonction ci-dessus et à appeler également org-link-set-parameterssi vous utilisez org-mode9. L'argument supplémentaire org-id-get-with-outline-path-completionvous permet de limiter les titres que vous avez choisis, tout comme org-refile-targetslorsque vous effectuez un nouveau dépôt. Voir l'aide pour tout, mais un paramètre commun est celui ((org-agenda-files :maxlevel . 3) (nil :maxlevel . 2))qui limite à 3 niveaux profonds dans les fichiers d'agenda et 2 dans le tampon actuel.
erikstokes