我希望自动化 org-refile,以便它能找到所有匹配项并将它们重新归档到特定位置(但不归档)。我发现了一种完全自动化的归档多个待办事项的方法,我希望找到或创建(借助一些帮助)类似于这个很棒的功能的东西(但针对不同的标题/位置而不是归档): https://github.com/tonyday567/jwiegley-dot-emacs/blob/master/dot-org.el
(defun org-archive-done-tasks ()
(interactive)
(save-excursion
(goto-char (point-min))
(while (re-search-forward "\* \\(None\\|Someday\\) " nil t)
(if (save-restriction
(save-excursion
(org-narrow-to-subtree)
(search-forward ":LOGBOOK:" nil t)))
(forward-line)
(org-archive-subtree)
(goto-char (line-beginning-position))))))
我还发现了这个(由 编写aculich
),这是朝着正确方向迈出的一步,但仍然需要手动重复该功能: https://stackoverflow.com/questions/7509463/how-to-move-a-subtree-to-another-subtree-in-org-mode-emacs
;; I also wanted a way for org-refile to refile easily to a subtree, so I wrote some code and generalized it so that it will set an arbitrary immediate target anywhere (not just in the same file).
;; Basic usage is to move somewhere in Tree B and type C-c C-x C-m to mark the target for refiling, then move to the entry in Tree A that you want to refile and type C-c C-w which will immediately refile into the target location you set in Tree B without prompting you, unless you called org-refile-immediate-target with a prefix arg C-u C-c C-x C-m.
;; Note that if you press C-c C-w in rapid succession to refile multiple entries it will preserve the order of your entries even if org-reverse-note-order is set to t, but you can turn it off to respect the setting of org-reverse-note-order with a double prefix arg C-u C-u C-c C-x C-m.
(defvar org-refile-immediate nil
"Refile immediately using `org-refile-immediate-target' instead of prompting.")
(make-local-variable 'org-refile-immediate)
(defvar org-refile-immediate-preserve-order t
"If last command was also `org-refile' then preserve ordering.")
(make-local-variable 'org-refile-immediate-preserve-order)
(defvar org-refile-immediate-target nil)
"Value uses the same format as an item in `org-refile-targets'."
(make-local-variable 'org-refile-immediate-target)
(defadvice org-refile (around org-immediate activate)
(if (not org-refile-immediate)
ad-do-it
;; if last command was `org-refile' then preserve ordering
(let ((org-reverse-note-order
(if (and org-refile-immediate-preserve-order
(eq last-command 'org-refile)) nil org-reverse-note-order)))
(ad-set-arg 2 (assoc org-refile-immediate-target (org-refile-get-targets)))
(prog1 ad-do-it
(setq this-command 'org-refile)))))
(defadvice org-refile-cache-clear (after org-refile-history-clear activate)
(setq org-refile-targets (default-value 'org-refile-targets))
(setq org-refile-immediate nil)
(setq org-refile-immediate-target nil)
(setq org-refile-history nil))
;;;###autoload
(defun org-refile-immediate-target (&optional arg)
"Set current entry as `org-refile' target.
Non-nil turns off `org-refile-immediate', otherwise `org-refile'
will immediately refile without prompting for target using most
recent entry in `org-refile-targets' that matches
`org-refile-immediate-target' as the default."
(interactive "P")
(if (equal arg '(16))
(progn
(setq org-refile-immediate-preserve-order
(not org-refile-immediate-preserve-order))
(message "Order preserving is turned: %s"
(if org-refile-immediate-preserve-order
"on" "off")))
(setq org-refile-immediate (unless arg t))
(make-local-variable 'org-refile-targets)
(let* ((components (org-heading-components))
(level (first components))
(heading (nth 4 components))
(string (substring-no-properties heading)))
(add-to-list 'org-refile-targets
(append (list (buffer-file-name))
(cons :regexp
(format "^%s %s$"
(make-string level ?*)
string))))
(setq org-refile-immediate-target heading))))
(define-key org-mode-map "\C-c\C-x\C-m" 'org-refile-immediate-target)
aculich
如果或其他 Maven 可以创建类似于的变量,(setq org-archive-location "~/0.todo.org::* Archived Tasks")
以便用户可以指定文件和标题(这已经是功能的一部分),那肯定会很有帮助org-archive-subtree
。我正在搜索并标记,因为我没有足够的资金来为这个设置创建类似的东西org-archive-location
。
编辑:更近了一步——几乎自由了……
(defun lawlist-auto-refile ()
(interactive)
(beginning-of-buffer)
(re-search-forward "\* UNDATED")
(org-refile-immediate-target) ;; cursor must be on a heading to work.
(save-excursion
(re-search-backward "\* UNDATED") ;; must be written in such a way so that sub-entries of * UNDATED are not searched; or else infinity loop.
(while (re-search-backward "\* \\(None\\|Someday\\) " nil t)
(org-refile)
)
)
)
答案1
解决方案 # A:
(defun lawlist-auto-refile ()
(interactive)
(setq org-archive-save-context-info nil)
(setq org-archive-location "/Users/HOME/.0.data/*TODO*::* UNDATED")
(beginning-of-buffer)
(re-search-forward "\* UNDATED")
(save-excursion
;; must be coded in such a way so that sub-entries of * UNDATED are not searched; or else cut-and-paste infinity loop.
(while (re-search-backward "\* \\(None\\|Someday\\) " nil t)
(org-archive-subtree)
)
)
)
解决方案 # B:
(defun lawlist-auto-refile-solution-b ()
(interactive)
(beginning-of-buffer)
(re-search-forward "\* UNDATED")
(org-refile-immediate-target) ;; cursor must be on a heading to work.
(save-excursion
;; must be coded in such a way so that sub-entries of * UNDATED are not searched; or else cut-and-paste infinity loop.
(while (re-search-backward "\* \\(None\\|Someday\\) " nil t)
(org-refile)
)
)
)
;; I also wanted a way for org-refile to refile easily to a subtree, so I wrote some code and generalized it so that it will set an arbitrary iate target anywhere (not just in the same file).
;; Basic usage is to move somewhere in Tree B and type C-c C-x C-m to mark the target for refiling, then move to the entry in Tree A that you want to refile and type C-c C-w which will immediately refile into the target location you set in Tree B without prompting you, unless you called org-refile-iate-target with a prefix arg C-u C-c C-x C-m.
;; Note that if you press C-c C-w in rapid succession to refile multiple entries it will preserve the order of your entries even if org-reverse-note- is set to t, but you can turn it off to respect the setting of org-reverse-note-order with a double prefix arg C-u C-u C-c C-x C-m.
(defvar org-refile-immediate nil
"Refile immediately using `org-refile-immediate-target' instead of prompting.")
(make-local-variable 'org-refile-immediate)
(defvar org-refile-immediate-preserve-order t
"If last command was also `org-refile' then preserve ordering.")
(make-local-variable 'org-refile-immediate-preserve-order)
(defvar org-refile-immediate-target nil)
"Value uses the same format as an item in `org-refile-targets'."
(make-local-variable 'org-refile-immediate-target)
(defadvice org-refile (around org-immediate activate)
(if (not org-refile-immediate)
ad-do-it
;; if last command was `org-refile' then preserve ordering
(let ((org-reverse-note-order
(if (and org-refile-immediate-preserve-order
(eq last-command 'org-refile)) nil org-reverse-note-order)))
(ad-set-arg 2 (assoc org-refile-immediate-target (org-refile-get-targets)))
(prog1 ad-do-it
(setq this-command 'org-refile)))))
(defadvice org-refile-cache-clear (after org-refile-history-clear activate)
(setq org-refile-targets (default-value 'org-refile-targets))
(setq org-refile-immediate nil)
(setq org-refile-immediate-target nil)
(setq org-refile-history nil))
;;;###autoload
(defun org-refile-immediate-target (&optional arg)
"Set current entry as `org-refile' target.
Non-nil turns off `org-refile-immediate', otherwise `org-refile'
will immediately refile without prompting for target using most
recent entry in `org-refile-targets' that matches
`org-refile-immediate-target' as the default."
(interactive "P")
(if (equal arg '(16))
(progn
(setq org-refile-immediate-preserve-order
(not org-refile-immediate-preserve-order))
(message "Order preserving is turned: %s"
(if org-refile-immediate-preserve-order
"on" "off")))
(setq org-refile-immediate (unless arg t))
(make-local-variable 'org-refile-targets)
(let* ((components (org-heading-components))
(level (first components))
(heading (nth 4 components))
(string (substring-no-properties heading)))
(add-to-list 'org-refile-targets
(append (list (buffer-file-name))
(cons :regexp
(format "^%s %s$"
(make-string level ?*)
string))))
(setq org-refile-immediate-target heading))))
(define-key org-mode-map "\C-c\C-x\C-m" 'org-refile-immediate-target)