2012-04-13 9 views
10

Generalmente uso org-mode para realizar un seguimiento de TODO. Tengo archivos como:Mantener el contexto al archivar en Emacs org-mode

* Misc. 
** TODO Task 1 
** TODO Task 2 
* Project 1 
** TODO Task 1 
** TODO Task 2 

al archivar subárboles enteros como Project 1 funciona como es debido, no estoy a poder mover Task 1 en Misc. tal que el fichero de archivo se ve así (haciendo caso omiso de las propiedades de este ejemplo):

* Misc 
** DONE Task 1 

En otras palabras, deseo conservar todas las secciones a las que pertenece una tarea. ¿Hay una manera rápida de hacer esto?

Respuesta

14

es probable que desea establecer la propiedad :ARCHIVE: en los titulares de los padres.

se le permite titular org-archive-location configuración específica. (Véase la manual)

por ejemplo, si su archivo de almacenamiento es establecer como %s_archive usted quiere que su archivo original a tener este aspecto

* Misc. 
    :PROPERTIES: 
    :ARCHIVE: %s_archive::* Misc 
    :END: 
** TODO Task 1 
** TODO Task 2 
* Project 1 
    :PROPERTIES: 
    :ARCHIVE: %s_archive::* Project 1 
    :END: 
** TODO Task 1 
** TODO Task 2 

Esto sería enviado ningún subárboles en * Misc a un titular * Misc en el archivo de almacenamiento, y haría el equivalente para los subárboles en Project 1 (a menos que se archiva el conjunto árbol en una sola toma). El archivo del árbol padre después de los subárboles parece agregarlo como un subtítulo adicional debajo del destino. No es compatible con varios niveles, por lo que tendrá que configurar los titulares de los archivos de archivo con anticipación para garantizar que salga como lo desee si necesita una configuración compleja de ese tipo.

También puede usar esta propiedad para archivar árboles específicos en archivos separados (para fines de exportación/publicación/uso compartido).

+0

Esta es una solución muy agradable y limpio. Funciona según lo previsto.Mi configuración es lo suficientemente simple, así que supongo que no tendrá problemas con la falta de soporte de múltiples niveles. ¡Gracias! –

4

No creo que org-mode tenga soporte para reflejar directamente el contexto actual dentro de su archivo de almacenamiento.

Hay una variable relevante, org-archive-location que se puede utilizar para especificar un solo encabezado para colocar el elemento archivado, pero no se admiten varios niveles dentro del árbol. En this page hay dos consejos para org-archive-subtree que pueden ser lo suficientemente buenos. Estoy replicando el primero aquí en caso de que el sitio desaparece:

(defadvice org-archive-subtree (around my-org-archive-subtree activate) 
    (let ((org-archive-location 
     (if (save-excursion (org-back-to-heading) 
          (> (org-outline-level) 1)) 
      (concat (car (split-string org-archive-location "::")) 
        "::* " 
        (car (org-get-outline-path))) 
      org-archive-location))) 
    ad-do-it)) 

El segundo, y más complicado también conserva las etiquetas que se encuentran en los encabezados de nivel superior.

Lo último que puede ser útil es la variable personalizada org-archive-save-context-info. Si esta lista contiene el símbolo 'olpath, la entrada archivada contendrá la propiedad :ARCHIVE_OLPATH:, que se establece en la ruta del esquema de la entrada archivada (por ejemplo, Projects/Misc. Tal vez pueda hacer un procesamiento posterior en el org-archive-subtree y reubicar la entrada archivada en su esquema original ruta conforme al siguiente.

3
;; org-archive-subtree-hierarchical.el 
;; modified from https://lists.gnu.org/archive/html/emacs-orgmode/2014-08/msg00109.html 

;; In orgmode 
;; * A 
;; ** AA 
;; *** AAA 
;; ** AB 
;; *** ABA 
;; Archiving AA will remove the subtree from the original file and create 
;; it like that in archive target: 

;; * AA 
;; ** AAA 

;; And this give you 
;; * A 
;; ** AA 
;; *** AAA 


(require 'org-archive) 

(defun org-archive-subtree-hierarchical--line-content-as-string() 
    "Returns the content of the current line as a string" 
    (save-excursion 
    (beginning-of-line) 
    (buffer-substring-no-properties 
    (line-beginning-position) (line-end-position)))) 

(defun org-archive-subtree-hierarchical--org-child-list() 
    "This function returns all children of a heading as a list. " 
    (interactive) 
    (save-excursion 
    ;; this only works with org-version > 8.0, since in previous 
    ;; org-mode versions the function (org-outline-level) returns 
    ;; gargabe when the point is not on a heading. 
    (if (= (org-outline-level) 0) 
     (outline-next-visible-heading 1) 
     (org-goto-first-child)) 
    (let ((child-list (list (org-archive-subtree-hierarchical--line-content-as-string)))) 
     (while (org-goto-sibling) 
     (setq child-list (cons (org-archive-subtree-hierarchical--line-content-as-string) child-list))) 
     child-list))) 

(defun org-archive-subtree-hierarchical--org-struct-subtree() 
    "This function returns the tree structure in which a subtree 
belongs as a list." 
    (interactive) 
    (let ((archive-tree nil)) 
    (save-excursion 
     (while (org-up-heading-safe) 
     (let ((heading 
       (buffer-substring-no-properties 
       (line-beginning-position) (line-end-position)))) 
      (if (eq archive-tree nil) 
       (setq archive-tree (list heading)) 
      (setq archive-tree (cons heading archive-tree)))))) 
    archive-tree)) 

(defun org-archive-subtree-hierarchical() 
    "This function archives a subtree hierarchical" 
    (interactive) 
    (let ((org-tree (org-archive-subtree-hierarchical--org-struct-subtree)) 
     (this-buffer (current-buffer)) 
     (file (abbreviate-file-name 
       (or (buffer-file-name (buffer-base-buffer)) 
        (error "No file associated to buffer"))))) 
    (save-excursion 
     (setq location (org-get-local-archive-location) 
      afile (org-extract-archive-file location) 
      heading (org-extract-archive-heading location) 
      infile-p (equal file (abbreviate-file-name (or afile "")))) 
     (unless afile 
     (error "Invalid `org-archive-location'")) 
     (if (> (length afile) 0) 
      (setq newfile-p (not (file-exists-p afile)) 
       visiting (find-buffer-visiting afile) 
       buffer (or visiting (find-file-noselect afile))) 
     (setq buffer (current-buffer))) 
     (unless buffer 
     (error "Cannot access file \"%s\"" afile)) 
     (org-cut-subtree) 
     (set-buffer buffer) 
     (org-mode) 
     (goto-char (point-min)) 
     (while (not (equal org-tree nil)) 
     (let ((child-list (org-archive-subtree-hierarchical--org-child-list))) 
      (if (member (car org-tree) child-list) 
       (progn 
       (search-forward (car org-tree) nil t) 
       (setq org-tree (cdr org-tree))) 
      (progn 
       (goto-char (point-max)) 
       (newline) 
       (org-insert-struct org-tree) 
       (setq org-tree nil))))) 
     (newline) 
     (org-yank) 
     (when (not (eq this-buffer buffer)) 
     (save-buffer)) 
     (message "Subtree archived %s" 
       (concat "in file: " (abbreviate-file-name afile)))))) 

(defun org-insert-struct (struct) 
    "TODO" 
    (interactive) 
    (when struct 
    (insert (car struct)) 
    (newline) 
    (org-insert-struct (cdr struct)))) 

(defun org-archive-subtree() 
    (org-archive-subtree-hierarchical) 
) 

Este truco solo actúan como refile al archivo de almacenamiento con todo misma estructura matriz, ningún archivo :PROPERTIES: aquí.

También como una esencia aquí: https://gist.github.com/CodeFalling/87b116291aa87fde72cb

+0

funciona como se esperaba, muy agradable! –

+0

¡Increíble! Muchas gracias! – Jeremy

+0

Loved it. Se combina muy bien con una clave en la agenda: (define-key org-agenda-mode-map "z" 'org-agenda-archivo) – Jeremy

Cuestiones relacionadas