获取组织链接以自动插入链接描述?


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-locationdefault-description函数中的功能有org-insert-link帮助吗? 如果LINK-LOCATION参数为非nil,则此值将用作链接位置,而不是交互式读取一个值。如果DEFAULT-DESCRIPTION参数为非nil,则此值将用作默认描述。
法律名单

@lawlist:感谢您的建议,尽管我不确定如何将其设置为交互式使用而不将其包装在另一个函数中。但是,这使我更加仔细地阅读了文档字符串,这使我得到了各种各样的答案。

Answers:


4

在文档字符串的底部埋org-insert-link有一个注释:

如果org-make-link-description-function为非nil,则将使用链接目标调用此函数,并且结果将是默认链接描述。

显然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)

这有点hacky,我还没有对其进行广泛的测试,但是到目前为止,它似乎仍然有效。当然,看到更优雅的解决方案会很高兴。


2
既然您已经知道了此功能,您是否可以抛弃它dired-store-link并仅使用它来创建所需的描述?我认为那会缩短很多。
马拉巴巴2015年

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为非零。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.