Jak zaimplementować identyfikatory łączy w stylu Markdown w trybie organizacji?

22

Czasami muszę używać tego samego łącza w wielu miejscach w długim dokumencie.

W takich przypadkach przydatne byłyby identyfikatory linków, takie jak przy przecenianiu. Od odwołania do składni markdown ,

Opcjonalnie możesz użyć spacji, aby oddzielić zestawy nawiasów:

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

Następnie, w dowolnym miejscu w dokumencie, definiujesz etykietę linku w ten sposób, w linii:

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

Wierzyłem, że skrót linków w trybie org działa w ten sam sposób (bez tagów), ale tak nie jest.

Identyfikatory linków mają mieć centralne miejsce do edycji linków. Dobra lokalizacja byłaby na końcu dokumentu. Pełne linki są zdefiniowane w identyfikatorze, ale tylko identyfikator jest używany w innym miejscu dokumentu, w którym musimy umieścić hiperłącza. Podczas eksportowania identyfikatory są zastępowane rzeczywistymi hiperłączami.

Korzyści z tego podejścia to:

  • Kiedy linki się zmieniają, musimy jedynie zmodyfikować definicje ID. Podczas eksportowania hiperłącza w dokumencie zostaną do tego zaktualizowane.
  • Szybsze wstawianie hiperłącza podczas pisania dokumentu, ponieważ nie trzeba za każdym razem pobierać i wklejać pełnych linków. Wpisujesz identyfikatory w dokumencie i definiujesz je w bloku na końcu dokumentu.
Kaushal Modi
źródło
Czy to do użytku czy na eksport?
Malabarba
Wykorzystanie jest do eksportu. Celem jest posiadanie jednego miejsca do edycji linku i użycie identyfikatora, w którym chcę umieścić hiperłącza. Na razie uciekam się do korzystania z makr w trybie org, które rozwijają się do [[Link][Link Name]]. Ale podejście do ID, jak w Markdown, będzie czystsze.
Kaushal Modi
Dla mnie to wygląda jak przypis. Niektóre inne możliwości, które mogą działać, to cele radiowe ( orgmode.org/manual/Radio-targets.html#Radio-targets ) lub wewnętrzne linki do <<targets>> orgmode.org/manual/Internal-links.html#Internal-links .
John Kitchin,

Odpowiedzi:

20

Ta strona ma ładny opis, jak rozszerzyć linki w trybie organizacji. Nie dotyczy twojego szczególnego zainteresowania, ale wyjaśnia podstawową zasadę.
Powiedzmy, że chcemy, aby Twoje linki były zdefiniowane w ten sposób w dowolnym miejscu w buforze,

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

i przywołałem w ten sposób

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

Najpierw musisz powiedzieć organizacji, jak postępować i jak wyeksportować link.

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

Następnie, po prostu trzeba zdecydować, jak ty chcesz obsługiwać ten link.

(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
źródło
Nie jestem pewien, do czego byłby użyty tytuł, o którym wspomniałeś. Jeśli dasz mi znać, mogę to dodać.
Malabarba,
1
Zauważam, że dla istniejących przykładów funkcji eksportu: docview, bbdb, wraz z org-add-link-typewywołaniem funkcji, również to robią (add-hook 'org-store-link-functions 'org-LINKTYPE-store-link).
Kaushal Modi