Отримати посилання org, щоб автоматично вставити опис посилання?


11

З: Як я можу отримати власну orgфункцію посилання, щоб автоматично вставити опис?

Я хотів би зберігати orgпосилання на файли в diredбуфері, але я вважаю за краще, щоб опис посилання було ім'ям файлу sans path, а не повідомляти про повний шлях, тобто:

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

Тепер: org-store-linkпосилання на жорсткі коди diredдля надання за замовчуванням. Натомість я написав користувальницьку функцію (cribbing з жорстко закодованої функції) і додав її до 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 не дорівнює нулю, це значення буде використовуватися як опис за замовчуванням.
законник

@lawlist: дякую за пропозицію, хоча я не впевнений, як би встановити її в інтерактивному режимі, не перетворюючи її на іншу функцію. Однак це змусило мене більш уважно читати доктрину, що наштовхнуло мене на своєрідну відповідь.
День

Відповіді:


4

Похований у нижній частині доктрину для 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
@Malabarba: ти, мабуть, маєш рацію - цю функцію можна було б переписати, щоб перевірити посилання на файл і продовжити відповідний процес. Спробую це, коли отримаю вільну хвилину.
День

3

Я використовую org 9.1.6, і на мій страх здається, що org-store-link-functionsзараз це вбудована функція org (а не гачок), тому оригінальне рішення більше не працює. Можливо, буде вирішено використання 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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.