org-refile到一个已知的固定位置


11

我正在尝试编写一个函数,该函数将带有标题并将其重新归档到一个特定的位置。的文档org-refile

(org-refile &optional GOTO DEFAULT-BUFFER RFLOC MSG)

并且RFLOC

RFLOC can be a refile location obtained in a different way.

但是我不知道这是什么“另类方式”,并且我已经搜索了半天,没有看到任何示例。我知道文件,也知道目标的标题,但是我不知道将其形成所需内容的语法。我得到的最接近的是:

(org-refile nil #("~/Org/bookmarks.org")

然后会提示我输入标题,但是我当然不希望它提示我,我想提供它。

我是elisp的新手,我猜到了我能想到的每种语法。有人知道该怎么说吗?


必须有一个办法做到你居然想在这里的东西,但如果你没有找到它,这里有一个解决方法:stackoverflow.com/questions/7681326/...
布莱恩ž

我使用以下代码片段来完成您要寻找的内容: (let* ( (org-archive-location "/path/to/org-file::* NAME_OF_HEADING") (org-archive-save-context-info nil)) (org-archive-subtree)) 自从您询问了以后org-refile,我可能不会将其添加到答案中,但是该代码片段可以很好地完成工作。是两个冒号需要的。我一直在使用它,甚至创建了一个自定义版本org-archive-subtree来禁止显示该消息,以便在我自动重新组织整个组织文件时没有数百个消息。
法律列表

谢谢lawlist,这是一个不错的摘录,我可能会在另一个上下文中使用它。很高兴在这里进行记录。
jtgd 2015年

Answers:


9

我想知道RFLOC以前应该是什么样,但从未进行过调查。查看组织的源代码,它应该是一个包含以下内容的列表:

  • 标题
  • 文件
  • re(正则表达式)
  • pos(目标标题的位置)

我没有尝试过该re元素,但是这是一个简单的函数,将org-refile使用从给定的FILE和HEADING构建的RFLOC进行调用:

(defun my/refile (file headline)
  (let ((pos (save-excursion
               (find-file file)
               (org-find-exact-headline-in-buffer headline))))
    (org-refile nil nil (list headline file nil pos))))

这将打开目标文件,并使用org函数查找目标标题的位置,然后构建要传递给的RFLOC列表org-refile


5

非常感谢@glucas,我​​已经将您的解决方案纳入了我的最后一个解决方案。关键信息是知道RFLOC的格式。我确实尝试过提供文件名和标题文本的列表,但是我却缺少了其他元素和多余的零。我最终得到的是:

(defun jay/refile-to (file headline)
    "Move current headline to specified location"
    (let ((pos (save-excursion
                 (find-file file)
                 (org-find-exact-headline-in-buffer headline))))
      (org-refile nil nil (list headline file nil pos))))

(defun jay/refile-to-bookmarks ()
    "Move current headline to bookmarks"
    (interactive)
    (org-mark-ring-push)
    (jay/refile-to "~/Org/bookmarks.org" "New")
    (org-mark-ring-goto))

的doc save-excursion指出我们将返回到开始的位置,但似乎无法正常工作。它使我留在了目标目的地,这可能对一般而言是适当的refile-to,但是我只想让它移动路线并保持原状,以便在其中保存和恢复refile-to-bookmark

这样做的工作流程是,我首先从脚本中获取HTML链接列表,以读取RSS feed。我最初是让脚本为mu4e生成maildir文件,但无论如何我还是只是跟随着浏览器的链接,然后将感兴趣的书签加入了书签,所以现在我只生成** [[uri][title]]行列表。在跟踪从emacs到uzbl浏览器的链接后,我没有使用书签(生成相同形式的行),而是在设置标签后使用此命令将链接移动到我的bookmarks.org。因为我还使用了org speed-command t来标记和b为此命令使用,所以速度要快一点。我现在很高兴,也喜欢学习更多的elisp!


有几个细节,与您在此处所做的操作并不直接相关:RFLOC的第一个元素实际上可以是任何字符串。它仅用作目标位置的逻辑名,如“重新归档为xxx”消息中所示。位置实际上仅由文件和位置标记定义。re据我所知,RFLOC 的元素将被忽略。它在org.el中的其他一些用于处理目标位置的函数中使用。
glucas 2015年

1
至于原因,我不明白,我能得到您的refile-to通过在末尾添加此功能恢复到原来的位置,后let(switch-to-buffer (current-buffer))。似乎它什么也没做,但是对我有用。
glucas 2015年

再次感谢@glucas。是的,这似乎确实有效,我已经替换了我的-push-goto。您被留在另一个缓冲区中似乎确实很奇怪,但是它认为当前缓冲区是前一个缓冲区。
jtgd 2015年
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.