स्वचालित रूप से लिंक विवरण सम्मिलित करने के लिए org लिंक प्राप्त करें?


11

प्रश्न: मैं orgस्वचालित रूप से विवरण डालने के लिए एक कस्टम लिंक फ़ंक्शन कैसे प्राप्त कर सकता हूं ?

मैं orgएक diredबफर में फ़ाइलों के लिंक को स्टोर करना चाहता हूं , लेकिन यह पसंद करेगा कि लिंक का विवरण फ़ाइल का नाम पथ हो, बजाय पूर्ण पथ की रिपोर्ट करने के, यानी:

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

अब: डिफ़ॉल्ट प्रदान करने के लिए org-store-linkहार्डकोड लिंक से 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 पैरामीटर गैर-शून्य है, तो यह मान डिफ़ॉल्ट विवरण के रूप में उपयोग किया जाएगा।
20-11 को लॉ

@lawlist: सुझाव के लिए धन्यवाद, हालांकि मुझे यकीन नहीं है कि मैं इसे दूसरे फ़ंक्शन में लपेटे बिना इंटरैक्टिव उपयोग में कैसे सेट करूंगा। हालांकि, इसने मुझे डॉकस्ट्रिंग को अधिक बारीकी से पढ़ा, जो मुझे एक प्रकार के उत्तर के लिए मिला।
दान

जवाबों:


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और बस इसका उपयोग अपने इच्छित विवरण को बनाने के लिए कर सकते हैं? मुझे लगता है कि यह बहुत छोटा होगा।
मालाबार

1
@ मलबारबा: आप शायद सही हैं - यह फ़ंक्शन किसी फ़ाइल के लिंक का निरीक्षण करने और तदनुसार आगे बढ़ने के लिए फिर से लिखा जा सकता है। फालतू पल आने पर इसे आजमाऊंगा।
दान

3

मैं मूल 9.1.6 का उपयोग कर रहा हूं, और मेरे निधन से ऐसा लगता है कि org-store-link-functionsअब बिल्ट ऑर्गन फ़ंक्शन (हुक के बजाय) है, इसलिए मूल समाधान अब काम नहीं करता है। उपयोग करने के लिए वर्कअराउंड हो सकता है 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गैर-शून्य है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.