Wie implementiert man Link-IDs im Markdown-Stil im Organisationsmodus?

22

Manchmal muss ich den gleichen Link an mehreren Stellen in einem langen Dokument verwenden.

In diesen Fällen wäre es nützlich, Link-IDs wie im Markdown zu haben. Aus der Abschriftensyntax ref ,

Sie können optional ein Leerzeichen verwenden, um die Sätze von Klammern zu trennen:

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

Dann definieren Sie an einer beliebigen Stelle im Dokument Ihre Verknüpfungsbezeichnung wie folgt in einer eigenen Zeile:

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

Ich war der Meinung, dass die Link-Abkürzung im Org-Modus genauso funktionieren würde (ohne Tags), aber das ist nicht der Fall.

Der Zweck von Link-IDs besteht darin, eine zentrale Stelle zum Bearbeiten der Links zu haben. Ein guter Ort wäre am Ende des Dokuments. Vollständige Links sind in der ID definiert, aber nur die ID wird an anderer Stelle im Dokument verwendet, an der wir die Hyperlinks platzieren müssen. Beim Export werden die IDs durch die tatsächlichen Hyperlinks ersetzt.

Vorteile dieses Ansatzes sind,

  • Wenn sich die Links ändern, müssen wir nur die ID-Definitionen ändern. Beim Export werden die Hyperlinks im Dokument entsprechend aktualisiert.
  • Schnelleres Einfügen von Hyperlinks beim Schreiben des Dokuments, da nicht jedes Mal die vollständigen Links abgerufen und eingefügt werden müssen. Sie geben die IDs in das Dokument ein und definieren sie in einem Block am Ende des Dokuments.
Kaushal Modi
quelle
Ist dies für die Verwendung oder für den Export?
Malabarba
Die Verwendung ist für den Export. Das Ziel ist es, einen Platz zum Bearbeiten des Links zu haben und nur die ID zu verwenden, an der ich die Hyperlinks platzieren möchte. Im Moment greife ich nur auf MACROs im Organisationsmodus zurück, die sich erweitern auf [[Link][Link Name]]. Aber der ID-Ansatz wie in Markdown wird sauberer sein.
Kaushal Modi
Das sieht für mich nach einer Fußnote aus. Einige andere Möglichkeiten, die funktionieren könnten, sind Funkziele ( orgmode.org/manual/Radio-targets.html#Radio-targets ) oder interne Links zu << Zielen >> orgmode.org/manual/Internal-links.html#Internal-links .
John Kitchin

Antworten:

20

Diese Seite enthält eine schöne Beschreibung zum Erweitern von Links im Organisationsmodus. Es geht nicht auf Ihr spezielles Anliegen ein, sondern erklärt das Grundprinzip.
Angenommen, wir möchten, dass Ihre Links an einer beliebigen Stelle im Puffer wie folgt definiert werden:

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

und wie folgt aufgerufen

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

Zunächst müssen Sie org mitteilen, wie sie dem Link folgen und ihn exportieren sollen.

(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)))

Dann müssen Sie nur noch entscheiden, wie Sie mit diesem Link umgehen möchten.

(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
quelle
Ich bin mir nicht sicher, wofür der Titel, den Sie in erwähnt haben, verwendet werden würde. Wenn Sie mich wissen lassen, kann ich es hinzufügen.
Malabarba
1
Ich stelle fest, dass für die vorhandenen Export-Funktionsbeispiele: docview, bbdb und der org-add-link-typeFunktionsaufruf dies ebenfalls tun (add-hook 'org-store-link-functions 'org-LINKTYPE-store-link).
Kaushal Modi