รับลิงก์องค์กรเพื่อแทรกคำอธิบายลิงก์โดยอัตโนมัติหรือไม่


11

ถาม:ฉันจะรับorgฟังก์ชันลิงก์ที่กำหนดเองเพื่อแทรกคำอธิบายโดยอัตโนมัติได้อย่างไร

ฉันต้องการจัดเก็บorgลิงก์ไปยังไฟล์ในdiredบัฟเฟอร์ แต่ต้องการให้คำอธิบายลิงก์เป็นชื่อไฟล์ sans path แทนที่จะรายงานเส้นทางแบบเต็มเช่น:

file:~/the/full/path/myfile.ext     ; default, but no thanks
myfile.ext                          ; what I want

ตอนนี้: org-store-linkลิงก์ hardcodes จากdiredเพื่อระบุค่าเริ่มต้น ฉันได้เขียนฟังก์ชั่นที่กำหนดเองแทน (เขียนจากฟังก์ชั่นฮาร์ดโค้ด) และเพิ่มไปที่org-store-link-functions:

(defun dired-store-link ()
  (when (derived-mode-p 'dired-mode)
    (let ((file (dired-get-filename nil t)))
      (setf file (if file
                     (abbreviate-file-name (expand-file-name file))
                   default-directory))
      (org-store-link-props :type        "dired"
                            :link        file
                            :description (file-name-nondirectory file))
      file)))

(add-to-list 'org-store-link-functions #'dired-store-link)

จนถึงดีมากและใช้งานได้ตามที่คาดหวัง แต่สำหรับสิ่งหนึ่ง:

  • เมื่อทำการโทรorg-insert-linkด้วยการใช้งานที่เป็นค่าเริ่มต้นมันจะแทรกลิงค์โดยไม่ต้องขอคำอธิบายจากฉัน
  • เมื่อโทรorg-insert-linkด้วยฟังก์ชั่นที่กำหนดเองของฉันมันจะแจ้งให้ฉันป้อนคำอธิบาย (ซึ่งมันจะถูกเติมด้วยชื่อไฟล์ที่เก็บไว้ใน:descriptionคุณสมบัติอย่างถูกต้อง)

ฉันจะไม่ขอให้อธิบายรายละเอียดทุกครั้งและต้องการorg-insert-linkใช้ค่า:descriptionที่ฟังก์ชันกำหนดเองตั้งค่า

ฉันorg-insert-linkจะโน้มน้าวให้ใช้งาน:descriptionโดยอัตโนมัติโดยไม่แจ้งให้ฉันได้อย่างไร


อาร์กิวเมนต์ตัวเลือกlink-locationหรือdefault-descriptionในฟังก์ชั่นorg-insert-linkช่วยใด ๆ ? หากพารามิเตอร์ LINK-LOCATION ไม่ใช่ค่ากลางค่านี้จะถูกใช้เป็นตำแหน่งลิงก์แทนการอ่านหนึ่งแบบโต้ตอบ หากพารามิเตอร์ DEFAULT-DESCRIPTION ไม่ใช่ค่ากลางค่านี้จะถูกใช้เป็นคำอธิบายเริ่มต้น
ฏหมาย

@ กฎหมาย: ขอบคุณสำหรับคำแนะนำถึงแม้ว่าฉันไม่แน่ใจว่าฉันจะตั้งไว้อย่างไรในการใช้แบบโต้ตอบโดยไม่ต้องห่อในฟังก์ชั่นอื่น อย่างไรก็ตามมันทำให้ฉันอ่าน docstring อย่างใกล้ชิดยิ่งขึ้นซึ่งทำให้ฉันได้รับคำตอบแปลก ๆ
แดน

คำตอบ:


4

ฝังไว้ที่ด้านล่างของ docstring เพื่อorg-insert-linkทราบว่า:

หากorg-make-link-description-functionไม่ใช่ศูนย์ฟังก์ชันนี้จะถูกเรียกด้วยเป้าหมายลิงก์และผลลัพธ์จะเป็นคำอธิบายลิงก์เริ่มต้น

เห็นได้ชัดว่าorgพ่นออกข้อมูลจำนวนมากในกระบวนการของการจัดเก็บการเชื่อมโยงดังนั้นทั้งหมดที่เหลือในเป็นรายการของรายการของรูปแบบorg-stored-links (link description)ตราบเท่าที่ฟังก์ชั่นก่อนหน้านี้มีชื่อไฟล์สำหรับลิงค์ดูเหมือนว่างานดังต่อไปนี้:

(defun org-link-describe (link desc)
  (if (file-exists-p link)
      desc
    (read-string "Description: " desc)))

(setf org-make-link-description-function #'org-link-describe)

มันเป็นเรื่องแฮ็คและฉันยังไม่ได้ทดสอบอย่างกว้างขวาง แต่ดูเหมือนว่ามันจะใช้งานได้ดี คงจะตื่นเต้นที่ได้เห็นทางออกที่หรูหรากว่านี้แน่นอน


2
ตอนนี้คุณรู้ถึงฟังก์ชั่นนี้แล้วคุณไม่สามารถทิ้งdired-store-linkและใช้สิ่งนี้เพื่อสร้างคำอธิบายที่คุณต้องการ? ฉันคิดว่ามันจะจบลงเร็วกว่ามาก
Malabarba

1
@Malabarba: คุณอาจจะถูกต้อง - ฟังก์ชั่นนี้สามารถเขียนใหม่เพื่อตรวจสอบลิงค์ของไฟล์และดำเนินการต่อไป จะลองใช้เมื่อฉันมีเวลาว่าง
แดน

3

ฉันใช้ org 9.1.6 และทำให้ฉันรู้สึกหดหู่ดูเหมือนว่าorg-store-link-functionsตอนนี้เป็นฟังก์ชั่น org ในตัว (แทนที่จะเป็น hook) ดังนั้นโซลูชันดั้งเดิมจึงใช้งานไม่ได้อีกต่อไป อาจมีวิธีแก้ปัญหาโดยใช้org-link-parametersแต่ฉันใช้แฮ็คเล็ก ๆ น้อย ๆ ต่อไปนี้ซึ่งดูเหมือนจะใช้เคล็ดลับ:

(defun my//dired-store-link (orig-fun &rest args)
  (if (derived-mode-p 'dired-mode)
      (let ((file (dired-get-filename nil t)))
        (setf file (if file
                       (abbreviate-file-name (expand-file-name file))
                     default-directory))
        (let ((link (concat "file:" file))
              (desc (file-name-nondirectory file)))
          (push (list link desc) org-stored-links)
          (car org-stored-links)))
    (apply orig-fun args)))
(advice-add 'org-store-link :around #'my//dired-store-link)

ในฐานะโบนัสสิ่งนี้ไม่ได้พร้อมท์ให้ใส่คำอธิบายเนื่องจากคำอธิบายที่ส่งไปorg-stored-linksนั้นไม่ใช่แบบไม่มีศูนย์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.