org-refile 时怎么改变 TODO 状态?

平时 capture 收集时,未处理的条目统一放到 inbox.org,格式为:

* WAITING 条目一
* WAITING 条目二
...

到一定时间时,org-refile 到相应文件內,比如 todo.org,条目相应变为:

* TODO 条目一
* TODO 条目二

refile的同时可以把 WAITING 改变为 TODO,然后放入再指定文件吗?

请教大神,谢谢。

对大神来说,emacs 的世界没有「可以吗」这个说法,只有「怎么做」,所以标题改一下。 :grinning:

看过这个么 https://www.reddit.com/r/orgmode/comments/56zzng/refiling_and_setting_state_in_one_go/

1 个赞

大神你太狠了,这都能发现。 抄了这段代码:

;; Create hook to auto-refile when todo is changing state
(add-hook 'org-after-todo-state-change-hook 'dk/refile-todo 'append)

(defun dk/refile-todo()
  (if (equal org-state "TODO")
      (dk/refile-to "~/org/todo.org" "Todo")
    (if (equal org-state "SOMEDAY")
        (dk/refile-to "~/org/inbox.org" "Inbox"))))

(defun dk/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)))
  (switch-to-buffer (current-buffer)))

暂时够用,感谢。

事实上我只是把你的问题放到了 Google,看第一个挺相关就贴给你了

虽然如此,也是很感谢的了。

上述代码经测试,大体上可以用了,不过有一个问题,假如我现在在 inbox.org 文件中 C-c C-t 处理一个条目为 TODO 状态,条目可以转到 todo.org 中,但同时前窗口也会切换至 todo.org,也就是当前激活的窗口,是移动条目的目标窗口,怎么才能不让窗口切换,一直停在源窗口內呢?

条目多的话,要不停地切回源窗口。

不吝赐教,感谢。

学一下elisp吧,之后你会发现,很多小问题就是几行代码的事情,自己hack的过程就很爽~

1 个赞

我之前的言下之意是可能你需要学习一下怎么更好的搜索

我猜其实 (switch-to-buffer (current-buffer)) 就是为了切换回去的,试了下我这边 (org-refile nil nil (list headline file nil pos)) 会提示

Refile to "Test" in file ~/org/inbox.org: done
apply: Wrong number of arguments: (0 . 0), 3

盲猜可能函数参数改了,你需要看看修改下。

1 个赞