如何在组织模式下实现Markdown样式的链接ID?


22

有时,我需要在一个长文档的多个位置使用相同的链接。

在这种情况下,具有链接标识(如markdown)将很有用。根据markdown语法ref

您可以选择使用空格来分隔各组括号:

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

然后,在文档中的任何地方,您都可以单独在一行上定义这样的链接标签:

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

我认为组织模式下的链接缩写将以相同的方式工作(不带标签),但事实并非如此。

链接ID的目的是在中心位置编辑链接。一个好的位置应该在文档的末尾。完整链接在ID中定义,但仅ID用于我们需要放置超链接的文档中的其他位置。导出时,这些ID将替换为实际的超链接。

这种方法的好处是,

  • 当链接更改时,我们只需修改ID定义。导出时,文档中的超链接将更新为该链接。
  • 编写文档时可以更快地插入超链接,因为不必每次都获取并粘贴完整链接。您在文档中键入ID,然后在文档末尾的块中定义它们。

这是供使用还是出口?
马拉巴巴

用法是用于出口。目的是在一个地方编辑链接,并仅在我要放置超链接的位置使用ID。目前,我只能使用扩展到的组织模式MACRO [[Link][Link Name]]。但是像Markdown中那样的ID方法会更干净。
Kaushal Modi 2014年

在我看来,这很像一个脚注。其他一些可能性,可能工作的无线电目标(orgmode.org/manual/Radio-targets.html#Radio-targets)或内部链接<<目标>> orgmode.org/manual/Internal-links.html#Internal-links
约翰·基钦

Answers:


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)
Kaushal Modi 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.