Bagaimana cara menerapkan ID tautan gaya Markdown dalam mode-org?


22

Kadang-kadang, saya perlu menggunakan tautan yang sama di banyak tempat dalam dokumen yang panjang.

Untuk kasus-kasus itu akan bermanfaat untuk memiliki ID tautan seperti pada penurunan harga. Dari sintaks markdown ,

Anda secara opsional dapat menggunakan ruang untuk memisahkan set kurung:

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

Lalu, di mana saja dalam dokumen, Anda menentukan label tautan Anda seperti ini, pada sebuah baris dengan sendirinya:

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

Saya percaya bahwa Singkatan Tautan dalam mode-org akan bekerja dengan cara yang sama (tanpa tag) tetapi tidak.

Tujuan ID tautan adalah untuk memiliki tempat sentral untuk mengedit tautan. Lokasi yang baik adalah di akhir dokumen. Tautan lengkap didefinisikan dalam ID tetapi hanya ID yang digunakan di tempat lain dalam dokumen di mana kita perlu menempatkan hyperlink. Saat mengekspor, ID diganti dengan hyperlink yang sebenarnya.

Manfaat dari pendekatan ini adalah,

  • Ketika tautan berubah, kita hanya perlu memodifikasi definisi ID. Saat mengekspor, hyperlink dalam dokumen akan diperbarui untuk itu.
  • Penyisipan hyperlink yang lebih cepat saat menulis dokumen sebagai dokumen tidak harus mendapatkan dan menempelkan tautan lengkap setiap saat. Anda mengetik ID dalam dokumen dan mendefinisikannya di blok di akhir dokumen.

Apakah ini untuk digunakan atau untuk ekspor?
Malabarba

Penggunaannya untuk ekspor. Tujuannya adalah untuk memiliki satu tempat untuk mengedit tautan dan hanya menggunakan ID di mana saya ingin menempatkan hyperlink. Untuk saat ini saya menggunakan hanya menggunakan mode org MACRO yang diperluas ke [[Link][Link Name]]. Tetapi pendekatan ID seperti di Markdown akan lebih bersih.
Kaushal Modi

Itu terlihat sangat mirip catatan kaki bagi saya. Beberapa kemungkinan lain yang mungkin berfungsi adalah target radio ( orgmode.org/manual/Radio-targets.html#Radio-targets ) atau tautan internal ke <<targets>> orgmode.org/manual/Internal-links.html#Internal-links .
John Kitchin

Jawaban:


20

Halaman ini memiliki deskripsi yang bagus tentang cara memperluas tautan mode-org. Itu tidak membahas masalah spesifik Anda, tetapi itu menjelaskan prinsip dasar.
Katakanlah kami ingin tautan Anda didefinisikan seperti ini, di mana saja di buffer,

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

dan dipanggil seperti ini

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

Pertama, Anda perlu memberi tahu org bagaimana untuk mengikuti dan bagaimana mengekspor tautan Anda.

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

Kemudian, Anda hanya perlu memutuskan bagaimana Anda ingin menangani tautan ini.

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

Saya tidak yakin untuk apa judul yang Anda sebutkan akan digunakan. Jika Anda memberi tahu saya, saya dapat menambahkannya.
Malabarba

1
Saya perhatikan bahwa untuk contoh fungsi ekspor yang ada: docview, bbdb, sepanjang org-add-link-typepemanggilan fungsi, mereka juga melakukannya (add-hook 'org-store-link-functions 'org-LINKTYPE-store-link).
Kaushal Modi
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.