Como automatizar org-refile para múltiplos todo

0

Estou procurando automatizar o org-refile para que ele encontre todas as correspondências e as arquive novamente em um local específico (mas não arquive). Eu encontrei um método totalmente automatizado de arquivamento de múltiplos tarefas, e estou esperançoso em encontrar ou criar (com alguma ajuda) algo semelhante a essa função incrível (mas para um cabeçalho / local diferente do arquivamento): link

(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))))))

Também encontrei isso (escrito por aculich ), que é um passo na direção certa, mas ainda requer a repetição da função manualmente: link

;; 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)

Com certeza seria útil se aculich ou algum outro maven pudesse criar uma variável semelhante a (setq org-archive-location "~/0.todo.org::* Archived Tasks") para que os usuários pudessem especificar o arquivo e o cabeçalho, que já fazem parte da funcionalidade org-archive-subtree . Estou fazendo uma pesquisa e marque porque não tenho recursos para criar algo como org-archive-location para essa configuração.

EDIT: Um passo mais perto - quase em casa livre. . .

(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)
            )
        )
)
    
por lawlist 01.07.2013 / 03:21

1 resposta

1

SOLUÇÃO # 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)
             )
         )
 )

SOLUÇÃO # 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) 
    
por 03.07.2013 / 06:16