組織モードでMarkdownスタイルのリンクIDを実装する方法は?


22

時には、長いドキュメントの複数の場所で同じリンクを使用する必要があります。

これらの場合、マークダウンのようなリンクIDを使用すると便利です。マークダウン構文refから、

オプションでスペースを使用して、括弧のセットを区切ることができます。

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

次に、ドキュメント内の任意の場所で、次のようなリンクラベルを1行で定義します。

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

org-modeのLink Abbreviationは(タグなしで)同じように機能すると信じていましたが、機能しません。

リンクIDの目的は、リンクを編集するための中心的な場所を持つことです。適切な場所は、ドキュメントの最後です。IDには完全なリンクが定義されていますが、ハイパーリンクを配置する必要があるドキュメント内の他の場所ではIDのみが使用されます。エクスポートすると、IDは実際のハイパーリンクに置き換えられます。

このアプローチの利点は、

  • リンクが変更されたら、ID定義を変更するだけです。エクスポートすると、ドキュメント内のハイパーリンクがそれに更新されます。
  • 毎回完全なリンクを取得して貼り付ける必要がないため、ドキュメントを作成する際のハイパーリンクの挿入が高速化されました。ドキュメントにIDを入力し、ドキュメントの最後にあるブロックで定義します。

これは使用のためですか、それともエクスポート用ですか?
マラバルバ14年

使用法は輸出用です。目的は、リンクを編集する1つの場所を持ち、ハイパーリンクを配置するIDを使用することです。今のところは、に展開する組織モードMACROを使用することに頼っています[[Link][Link Name]]。しかし、MarkdownのようなIDアプローチはよりクリーンになります。
カウシャルモディ

それは私にとって脚注のように見えます。動作する可能性のある他の可能性には、ラジオターゲット(orgmode.org/manual/Radio-targets.html#Radio-targets)または<< targets >> 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-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)
カウシャルモディ14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.