【问题标题】:Org mode internal link dynamic namingorg模式内链动态命名
【发布时间】:2020-06-13 18:18:57
【问题描述】:

有没有办法根据原始标题自动重命名链接?

例子:

* Headline 1
:PROPERTIES:
:ID: some_id
:END:

* Headline 2

 - Headline 1 // this is a link using an id

* Headline 3

 - Headline 1 // this is a link using an id

创建新的内部链接时,org 允许您为该链接指定文本。有没有办法根据标题动态更改链接文本?如果我将Headline 1 更改为Headline 4,我希望链接的文本也自动更改为Headline 4

这可能吗?

【问题讨论】:

  • 这是可能的 - 但它可能会慢得令人无法忍受。 每个字符插入之后都会运行一个钩子post-self-insert-hook。因此,您可以编写一个函数来检查每个链接的 ID 并适当地更改链接描述。但是您只想修改 Org 模式文件的钩子(这并不难)并使函数尽可能快,因为它将在每个字符插入后运行。这个钩子用于例如当您键入结束括号时,使匹配的开始括号闪烁 - 请参阅 simple.el 中的函数 blink-paren-post-self-insert-function
  • (我对 org 模式还很陌生,所以请原谅任何错误的假设)我也可以接受这样一种情况,即更新不会在每个字符条目上都被动地发生,而是由新的键绑定。例如。 org-update-link-descriptions-in-buffer,然后我们遍历整个缓冲区并进行更新。这意味着链接描述可能会过时一段时间,直到再次触发该功能。我更感兴趣的是“所以你可以编写一个函数来检查每个链接的 ID 并适当地更改链接描述。”可以实现。

标签: emacs hyperlink org-mode


【解决方案1】:

它有点慢,但这很有效:

(defun us/description-of-target-link (target-id)
  (car (org-map-entries '(org-entry-get nil "ITEM") (concat "ID=\"" target-id "\"")))
  )

(defun us/update-internal-link-descriptions ()
  (interactive)
  (setq offset 0)
  ;;; map over all elements in the buffer
  (org-element-map (org-element-parse-buffer) 'link
    (lambda (link)
      ;;; filter to internal links with id
      (when (string= (org-element-property :type link) "id")
        (setq content-start-point-raw (org-element-property :contents-begin link))
        (setq content-end-point-raw (org-element-property :contents-end link))
        (setq len-thing-to-remove (- content-end-point-raw content-start-point-raw))
        (setq new-description (us/description-of-target-link (org-element-property :path link)))
        (setq len-thing-to-add (length new-description))
        (setq offset-delta (- len-thing-to-add len-thing-to-remove))
        (setq content-remove-point-start-with-offset (+ content-start-point-raw offset))
        (setq content-remove-point-end-with-offset (+ content-end-point-raw offset))
        (goto-char content-remove-point-start-with-offset)
        (delete-region content-remove-point-start-with-offset content-remove-point-end-with-offset)
        (insert new-description)
        (setq offset (+ offset offset-delta ))
        )
      )
    )
  )

【讨论】:

    猜你喜欢
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    相关资源
    最近更新 更多