Як реалізувати ідентифікатори посилань стилю Markdown в org-режимі?


22

Часом мені потрібно використовувати одне і те ж посилання в декількох місцях у довгому документі.

У цих випадках було б корисно мати ідентифікатори посилань, як у розмітці. З синтаксису відмітки ref ,

Ви можете додатково використовувати пробіл для розділення наборів дужок:

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

Потім будь-де в документі ви визначаєте такий ярлик посилання, як цей, у рядку сам по собі:

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

Я вважав, що абревіатура посилань в org-режимі буде працювати так само (без тегів), але це не так.

Метою ідентифікаторів посилань є центральне місце для редагування посилань. Хороше розташування було б в кінці документа. Повні посилання визначені в ідентифікаторі, але тільки ідентифікатор використовується в іншому місці документа, де нам потрібно розмістити гіперпосилання. При експорті ідентифікатори замінюються фактичними гіперпосиланнями.

Переваги такого підходу:

  • Коли посилання змінюються, нам потрібно просто змінити визначення ідентифікаторів. При експорті гіперпосилання в документі будуть оновлені до цього.
  • Швидше вставлення гіперпосилання при написанні документа як одного не потрібно отримувати та вставляти повні посилання щоразу. Ви вводите ідентифікатори в документі та визначаєте їх у блоці в кінці документа.

Це для використання чи для експорту?
Малабарба

Використання для експорту. Мета - мати одне місце для редагування посилання та просто використовувати ідентифікатор, де я хочу розмістити гіперпосилання. Наразі я вдаюсь лише до використання МАКРО-режиму, що розширюється до [[Link][Link Name]]. Але ідентифікаційний підхід, як у Маркдаун, буде більш чистим.
Каушал Моді

Це дуже схоже на виноску. Деякі інші можливості, які можуть працювати, - це радіо-цілі ( orgmode.org/manual/Radio-targets.html#Radio-targets ) або внутрішні посилання на <<targets>> orgmode.org/manual/Internal-links.html#Internal-links .
Джон Кітчін

Відповіді:


20

На цій сторінці є хороший опис, як розширити посилання в режимі org. Це не стосується вашої конкретної проблеми, але пояснює основний принцип.
Скажімо, ми хочемо, щоб ваші посилання були визначені так, в будь-якому місці буфера,

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

і посилається так

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

По-перше, вам потрібно сказати org, як слідкувати та як експортувати своє посилання.

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

Тоді вам просто потрібно вирішити, як ви хочете обробити це посилання.

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

Я не впевнений, для чого використовуватиметься титул, про який ви згадали. Якщо ви дасте мені знати, я можу додати його.
Малабарба

1
Я помічаю, що для існуючих прикладів функції експорту: docview, bbdb, під час org-add-link-typeвиклику функції, вони також роблять (add-hook 'org-store-link-functions 'org-LINKTYPE-store-link).
Каушал Моді
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.