Làm cách nào để triển khai ID liên kết kiểu Markdown ở chế độ org?


22

Đôi khi, tôi cần sử dụng cùng một liên kết tại nhiều nơi trong một tài liệu dài.

Đối với những trường hợp đó, sẽ rất hữu ích khi có ID liên kết như trong markdown. Từ cú pháp đánh dấu ref ,

Bạn có thể tùy ý sử dụng một khoảng trắng để phân tách các bộ ngoặc:

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

Sau đó, bất cứ nơi nào trong tài liệu, bạn xác định nhãn liên kết của mình như thế này, trên chính một dòng:

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

Tôi tin rằng Viết tắt Liên kết ở chế độ org sẽ hoạt động theo cùng một cách (không có thẻ) nhưng không được.

Mục đích của ID liên kết là có một vị trí trung tâm để chỉnh sửa các liên kết. Một vị trí tốt sẽ ở cuối tài liệu. Liên kết đầy đủ được xác định trong ID nhưng chỉ ID được sử dụng ở nơi khác trong tài liệu nơi chúng tôi cần đặt siêu liên kết. Khi xuất, ID được thay thế bằng các siêu liên kết thực tế.

Lợi ích của phương pháp này là,

  • Khi các liên kết thay đổi, chúng ta chỉ cần sửa đổi các định nghĩa ID. Khi xuất, các siêu liên kết trong tài liệu sẽ được cập nhật vào đó.
  • Chèn siêu liên kết nhanh hơn khi viết tài liệu vì không cần phải lấy và dán các liên kết đầy đủ mỗi lần. Bạn nhập ID trong tài liệu và xác định chúng trong một khối ở cuối tài liệu.

Đây là để sử dụng hoặc xuất khẩu?
Malabarba

Việc sử dụng là cho xuất khẩu. Mục đích là để có một nơi để chỉnh sửa liên kết và chỉ cần sử dụng ID nơi tôi muốn đặt siêu liên kết. Hiện tại tôi chỉ sử dụng các MACRO chế độ org mở rộng sang [[Link][Link Name]]. Nhưng cách tiếp cận ID như trong Markdown sẽ sạch hơn.
Kaushal Modi

Điều đó trông rất giống như một chú thích cho tôi. Một số khả năng khác có thể hoạt động là các mục tiêu vô tuyến ( orgmode.org/manual/Radio-target.html#Radio-target ) hoặc liên kết nội bộ đến << Target >> orgmode.org/manual/Iternal-links.html#Iternal-links .
John Kitchin

Câu trả lời:


20

Trang này có một mô tả hay về cách mở rộng liên kết chế độ org. Nó không giải quyết mối quan tâm cụ thể của bạn, nhưng nó giải thích nguyên tắc cơ bản.
Giả sử chúng tôi muốn các liên kết của bạn được xác định như thế này, bất cứ nơi nào trong bộ đệm,

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

và được gọi như thế này

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

Trước tiên, bạn cần cho org biết cách theo dõi và cách xuất liên kết của bạn.

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

Sau đó, bạn chỉ cần quyết định cách bạn muốn xử lý liên kết này.

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

Tôi không chắc tiêu đề bạn đề cập trong sẽ được sử dụng cho mục đích gì. Nếu bạn cho tôi biết tôi có thể thêm nó vào.
Malabarba

1
Tôi nhận thấy rằng đối với các ví dụ về hàm xuất hiện có: docview, bbdb, cùng với org-add-link-typelệnh gọi hàm, chúng cũng thực hiện (add-hook 'org-store-link-functions 'org-LINKTYPE-store-link).
Kaushal Modi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.