Как реализовать идентификаторы ссылок в стиле Markdown в режиме org?

22

Иногда мне нужно использовать одну и ту же ссылку в нескольких местах длинного документа.

Для этих случаев было бы полезно иметь идентификаторы ссылок, как в уценке. Из синтаксиса уценки ref ,

При желании вы можете использовать пробел для разделения наборов скобок:

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

Затем в любом месте документа вы определяете ярлык ссылки следующим образом:

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

Я считал, что аббревиатура ссылки в режиме org будет работать так же (без тегов), но это не так.

Цель идентификаторов ссылок - иметь центральное место для редактирования ссылок. Хорошее место будет в конце документа. Полные ссылки определены в идентификаторе, но в другом месте документа используется только идентификатор, где нам нужно разместить гиперссылки. При экспорте идентификаторы заменяются фактическими гиперссылками.

Преимущества этого подхода,

  • Когда ссылки меняются, нам нужно просто изменить определения идентификаторов. При экспорте гиперссылки в документе будут обновлены до этого.
  • Более быстрая вставка гиперссылок при написании документа, поскольку не нужно каждый раз получать и вставлять полные ссылки. Вы вводите идентификаторы в документе и определяете их в блоке в конце документа.
Каушал Моди
источник
Это для использования или для экспорта?
Малабарба
Использование для экспорта. Цель состоит в том, чтобы иметь одно место для редактирования ссылки и просто использовать идентификатор, на котором я хочу разместить гиперссылки. Сейчас я прибегаю только к использованию MACRO в режиме org, которые расширяются до [[Link][Link Name]]. Но идентификационный подход, как в Markdown, будет чище.
Каушал Моди
Это выглядит как сноска для меня. Некоторые другие возможности, которые могут сработать, это радио цели ( orgmode.org/manual/Radio-targets.html#Radio-targets ) или внутренние ссылки на << target >> orgmode.org/manual/Internal-links.html#Internal-links ,
Джон Китчин

Ответы:

20

На этой странице есть хорошее описание того, как расширить ссылки в режиме орг. Это не решает вашу конкретную проблему, но объясняет основной принцип.
Допустим, мы хотим, чтобы ваши ссылки были определены так, где угодно в буфере,

#+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)))))
Malabarba
источник
Я не уверен, для чего будет использоваться название, которое вы упомянули в. Если вы дадите мне знать, я могу добавить это.
Малабарба,
1
Я заметил, что для существующих примеров функций экспорта: docview, bbdb, наряду с org-add-link-typeвызовом функции, они также делают (add-hook 'org-store-link-functions 'org-LINKTYPE-store-link).
Каушал Моди