Comment implémenter des ID de lien de style Markdown en mode organisation?

22

Parfois, j'ai besoin d'utiliser le même lien à plusieurs endroits dans un long document.

Pour ces cas, il serait utile d'avoir des ID de lien comme dans le démarque. De la syntaxe de Markdown ref ,

Vous pouvez éventuellement utiliser un espace pour séparer les jeux de crochets:

This is [an example] [id] reference-style link. 

Ensuite, n'importe où dans le document, vous définissez votre étiquette de lien comme ceci, sur une ligne à part:

[id]: http://example.com/ "Optional Title Here"

Je pensais que l' abréviation de lien en mode org fonctionnerait de la même manière (sans balises) mais ce n'est pas le cas.

Le but des ID de lien est d'avoir une place centrale pour éditer les liens. Un bon emplacement serait à la fin du document. Les liens complets sont définis dans l'ID, mais seul l'ID est utilisé ailleurs dans le document où nous devons placer les hyperliens. Lors de l'exportation, les ID sont remplacés par les hyperliens réels.

Les avantages de cette approche sont,

  • Lorsque les liens changent, nous devons simplement modifier les définitions d'ID. Lors de l'exportation, les liens hypertexte du document seront mis à jour en conséquence.
  • Insertion plus rapide des hyperliens lors de l'écriture du document car il n'est pas nécessaire d'obtenir et de coller les liens complets à chaque fois. Vous saisissez les ID dans le document et les définissez dans un bloc à la fin du document.
Kaushal Modi
la source
Est-ce pour usage ou pour exportation?
Malabarba
L'utilisation est destinée aux exportations. Le but est d'avoir un endroit pour éditer le lien et juste utiliser l'ID où je veux placer les hyperliens. Pour l'instant, je n'ai recours qu'à des macros en mode org qui s'étendent à [[Link][Link Name]]. Mais l'approche d'identification comme dans Markdown sera plus propre.
Kaushal Modi
Cela me ressemble beaucoup à une note de bas de page. Certaines autres possibilités qui pourraient fonctionner sont des cibles radio ( orgmode.org/manual/Radio-targets.html#Radio-targets ) ou des liens internes vers <<targets>> orgmode.org/manual/Internal-links.html#Internal-links .
John Kitchin

Réponses:

20

Cette page a une belle description sur la façon d'étendre les liens en mode organisation. Il ne répond pas à votre préoccupation spécifique, mais il explique le principe de base.
Disons que nous voulons que vos liens soient définis comme ceci, n'importe où dans le tampon,

#+LINK-ID: wiki http://www.emacswiki.org

et invoqué comme ça

[[lid:wiki][You should check out the wiki]]

Tout d'abord, vous devez indiquer à l'organisation comment suivre et comment exporter votre lien.

(org-add-link-type "lid" 'endless/open-id-link 'endless/export-id-link)

(defun endless/open-id-link (path)
  "Follow an ID link to PATH."
  (browse-url (endless/find-id-link path)))

(defun endless/export-id-link (path desc format)
  "Create the export version of an ID link specified by PATH and DESC.
FORMATs understood are 'latex and 'html."
  (setq path (endless/find-id-link path))
  (cond
   ((eq format 'html) (format "<a href=\"%s\">%s</a>" path desc))
   ((eq format 'latex) (format "\\href{%s}{%s}" path desc))
   (t desc)))

Ensuite, il vous suffit de décider comment vous souhaitez gérer ce lien.

(defun endless/find-id-link (id &optional noerror)
  "Find \"#+LINK-ID: ID\" in current buffer and return the link.
Unless NOERROR is non-nil, throw an error if link not found."
  (save-excursion
    (goto-char (point-min))
    (let ((case-fold-search t))
      (when (search-forward-regexp 
             (format "^#\\+LINK-ID: \\b%s\\b +\\(.*\\) *$" id)
             nil noerror)
        (match-string-no-properties 1)))))
Malabarba
la source
Je ne sais pas à quoi servirait le titre que vous avez mentionné dans le. Si vous me faites savoir que je peux l'ajouter.
Malabarba
1
Je remarque que pour les exemples de fonction d'exportation existants: docview, bbdb, le long de l' org-add-link-typeappel de fonction, ils le font également (add-hook 'org-store-link-functions 'org-LINKTYPE-store-link).
Kaushal Modi