emacs elisp org-mode

emacs - Cómo hacer coincidir/analizar las notas al final de una tarea en org-mode



elisp (1)

Estoy buscando una forma de combinar lo que llamo las "notas", que es la última línea (o conjunto de líneas) de una tarea de organización que dice: " These are the notes of the task. " These are the notes of the task.

He compuesto una expresión regular muy larga que puede hacer el trabajo, pero espero que org-mode ya proporcione algo mejor:

"^//(//*//*//)//(?: +//(Active//|Next Action//|Hold//|Reference//|Delegated//|Postponed//|Waiting//|Someday//|Planning//|Canceled//|None//)//)?//(?: +//(//[#.//]//)//)?//(?: +//(.*?//)//)??//(?:[ ]+//(:[[:alnum:]_@#%:]+://)//)?[ ]*//(?://(/n//)//)?//(?: +//(DEADLINE://|SCHEDULED://)//)?//(?: +//(<//)//([^>]+//)//(>//)//)?//(?: +//(DEADLINE://|SCHEDULED://)//)?//(?: +//(<//)//([^>]+//)//(>//)//)?//(?://(/n//)//)?//(?: +//(CLOSED:.*//)//)?//(?://(/n//)//)?//(?: +//(:PROPERTIES://)//)?//(?://(/n//)//)?//(?: +//(:ToodledoID://)//)?//(?: +//([0-9]+//)//)?//(?://(/n//)//)?//(?: +//(:ToodledoFolder://)//)?//(?: +//(EVENTS//|TASKS//|UNDATED//|DONE//|CONTACT//)//)?//(?://(/n//)//)//(?: +//(:Hash://)//)?//(?: +//(.*+//)//)?//(?://(/n//)//)?//(?: +//(:END://)//)?//(?://(/n//)//)?//(.*//(?:/n.*//)*?//)//(?:^//)"

** Delegated [#A] 0 @ Title of the task. :event:lawlist: DEADLINE: <2014-01-11 Sat 08:00> SCHEDULED: <2014-01-11 Sat> :PROPERTIES: :ToodledoID: 353081871 :ToodledoFolder: EVENTS :Hash: 20657e7586fcc67da708789d7bbc0fbd :END: These are the notes of the task.

Los ejemplos más completos de análisis de una tarea de organización que he encontrado usan org-element-parse-buffer , pero igual sigo sin ver la clave para extraer solo las notas: https://github.com/yyr/org- mode / blob / master / testing / lisp / test-org-element.el

Si es posible, me gustaría algo similar a este código imaginario (org-element-property :notes (org-element-at-point)) , que no requiere estrechamiento para subárbol para extraer las notas. Tengo un par de cientos de tareas, y estoy buscando una forma de peinar rápidamente el archivo org maestro y crear mi propio buffer de agenda personalizado que muestre la primera y quizás la segunda línea (si es la fecha límite o programada) y las notas en el final si existen . Tengo la sensación de que si tengo que restringirme al subárbol para 200 tareas, habrá una demora considerable para producir la visualización final.

Las primeras dos líneas de la tarea ya se manejan con esto:

(defvar lawlist-org-heading-regexp "^//(//*+//)//(?: +//(.*?//)//)?[ /t]*//(/n.*DEADLINE.*$//)" "Custom match org headline, plus the second line with a deadline.") (setq txt (save-excursion (org-back-to-heading t) (when (looking-at org-heading-regexp) (concat (match-string 1) " " (match-string 2) (if (and (looking-at lawlist-org-heading-regexp) (match-string 3)) (match-string 3)) "/n" )))) )

(message "%s" (org-element-map (org-element-parse-buffer) ''paragraph ''identity nil t)) me da lo siguiente:

(paragraph (:begin 244 :end 276 :contents-begin 244 :contents-end 276 :post-blank 0 :post-affiliated 244 :parent (section (:begin 58 :end 276 :contents-begin 58 :contents-end 276 :post-blank 0 :parent (headline (:raw-value 0 @ Title of the task. :begin 1 :end 276 :pre-blank 0 :hiddenp nil :contents-begin 58 :contents-end 276 :level 2 :priority 65 :tags (event lawlist) :todo-keyword Delegated :todo-type todo :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :quotedp nil :deadline (timestamp (:type active :raw-value <2014-01-11 Sat 08:00> :year-start 2014 :month-start 1 :day-start 11 :hour-start 8 :minute-start 0 :year-end 2014 :month-end 1 :day-end 11 :hour-end 8 :minute-end 0 :begin 71 :end 95 :post-blank 2)) :scheduled (timestamp (:type active :raw-value <2014-01-11 Sat> :year-start 2014 :month-start 1 :day-start 11 :hour-start nil :minute-start nil :year-end 2014 :month-end 1 :day-end 11 :hour-end nil :minute-end nil :begin 106 :end 122 :post-blank 0)) :TOODLEDOID 353081871 :TOODLEDOFOLDER EVENTS :HASH 20657e7586fcc67da708789d7bbc0fbd :CATEGORY .scratch :title (0 @ Title of the task.) :parent (org-data nil #4)) #2)) (planning (:closed nil :deadline (timestamp (:type active :raw-value <2014-01-11 Sat 08:00> :year-start 2014 :month-start 1 :day-start 11 :hour-start 8 :minute-start 0 :year-end 2014 :month-end 1 :day-end 11 :hour-end 8 :minute-end 0 :begin 71 :end 95 :post-blank 2)) :scheduled (timestamp (:type active :raw-value <2014-01-11 Sat> :year-start 2014 :month-start 1 :day-start 11 :hour-start nil :minute-start nil :year-end 2014 :month-end 1 :day-end 11 :hour-end nil :minute-end nil :begin 106 :end 122 :post-blank 0)) :begin 58 :end 123 :post-blank 0 :parent #2)) (property-drawer (:begin 123 :end 244 :hiddenp nil :contents-begin 139 :contents-end 235 :post-blank 0 :post-affiliated 123 :parent #2) (node-property (:key ToodledoID :value 353081871 :begin 139 :end 165 :post-blank 0 :parent #3)) (node-property (:key ToodledoFolder :value EVENTS :begin 165 :end 192 :post-blank 0 :parent #3)) (node-property (:key Hash :value 20657e7586fcc67da708789d7bbc0fbd :begin 192 :end 235 :post-blank 0 :parent #3))) #0)) These are the notes of the task.)


EDITAR (7 de enero de 2014): primer borrador de trabajo. El final de la expresión regular coincidirá con las notas hasta la siguiente línea en blanco, es decir, las notas pueden ser varias líneas con retornos duros y sin líneas en blanco entre ellas.

EDITAR (14 de enero de 2014): se revisaron 31 y 32 para que no se necesite una nueva línea final al final del búfer, es decir, ahora se reconoce una tarea sin notas al final del búfer. Revisado de 20 a 24 para que las posiciones de :ToodledoID: cajón y :ToodledoFolder: cajón sean intercambiables. Ejemplo revisado get-whopper función get-whopper para excluir 32.

EDITAR (14 de noviembre de 2014): Actualizó la expresión regular un poco, pero la funcionalidad sigue siendo la misma.

EDITAR (2 de diciembre de 2014): se eliminó la función personalizada y se reemplazó por stock org-back-to-heading .

EDITAR (6 de diciembre de 2014: renovación importante de expresiones regulares. La expresión regular ahora admite elementos opcionales para la mayoría de las entradas, y no se necesita una nueva línea final al final del búfer. Con la nueva revisión, la expresión regular puede usarse en un búfer *Org Agenda* que muestra solo elementos parciales del todo original, por ejemplo, encabezado + fecha límite / agenda / cerrada + notas, o encabezado + notas solamente. La :tag: sin embargo, es un ancla obligatoria - es decir , al menos se necesita una (1) etiqueta para que la expresión regular funcione correctamente. Las terminaciones de línea, es decir, /n , ya no son entradas coincidentes numeradas. La expresión regular admite entradas de tareas pendientes agrupadas sin ninguna línea nueva que las separe. Vea el hilo relacionado con respecto al grupo que no captura: https://.com/a/3513858/2112489 Vea también el hilo relacionado con eMacs de expresiones regulares multilínea: http://www.emacswiki.org/emacs/MultilineRegexp

(defvar whopper-regexp (concat "^//(//*//*//)" ;; 1 "//(?: +//(Active//|Next Action//|Hold//|Reference//|Delegated//|Postponed//|Waiting//|Someday//|Planning//|Canceled//|None//)//)?" ;; 2 "//(?: +//(//[#.//]//)//)?" ;; 3 "//(?: +//(.*?//)//)?" ;; 4 "//(?:[ ]+//(:[[:alnum:]_@#%:]+://)//)" ;; 5 ;; mandatory-anchor "//(?:/n +//(DEADLINE://|SCHEDULED://)//)?" ;; 6 "//(?: +//(<//)//([^>]+//)//(>//)//)?" ;; 7 | 8 | 9 "//(?: +//(DEADLINE://|SCHEDULED://)//)?" ;; 10 "//(?: +//(<//)//([^>]+//)//(>//)//)?" ;; 11 | 12 | 13 "//(?:/n +//(CLOSED:.*//)//)?" ;; 14 "//(?:/n +//(:PROPERTIES://)//)?" ;; 15 "//(?:/n +//(:ToodledoID://|:ToodledoFolder://)//)?" ;; 16 "//(?: +//([0-9]+//|EVENTS//|TASKS//|UNDATED//|DONE//|CONTACT//)//)?" ;; 17 "//(?:/n +//(:ToodledoID://|:ToodledoFolder://)//)?" ;; 18 "//(?: +//([0-9]+//|EVENTS//|TASKS//|UNDATED//|DONE//|CONTACT//)//)?" ;; 19 "//(?:/n +//(:Hash://)//)?" ;; 20 "//(?: +//(.*//)//)?" ;; 21 "//(?:/n +//(:END://)//)?" ;; 22 "//(?:/n//([a-zA-z0-9_@#%:-]+.*//(?:/n[a-zA-z0-9_@#%:-].*[^/n]//)*//)//)?" ;; 23 ) "Custom regexp for tasks, events, undated, none, and contacts.") (defun get-whopper () (save-excursion (org-back-to-heading t) (when (looking-at whopper-regexp) (concat (when (not (null (match-string 1))) (match-string 1)) ;; stars (when (not (null (match-string 2))) (concat " " (match-string 2))) ;; todo-state (when (not (null (match-string 3))) (concat " " (match-string 3))) ;; priority (when (not (null (match-string 4))) (concat " " (match-string 4))) ;; title (when (not (null (match-string 5))) (concat " " (match-string 5))) ;; tag (cond ((and (not (null (match-string 6))) ;; DEADLINE: (not (null (match-string 7))) ;; <-deadline (not (null (match-string 8))) ;; deadline-time-stamp (not (null (match-string 9))) ;; >-deadline (not (null (match-string 10))) ;; SCHEDULED: (not (null (match-string 11))) ;; <-scheduled (not (null (match-string 12))) ;; scheduled-time-stamp (not (null (match-string 13))) ) ;; >-scheduled (concat "/n " (match-string 6) ;; DEADLINE: " " (match-string 7) ;; <-deadline (match-string 8) ;; deadline-time-stamp (match-string 9) ;; >-deadline " " (match-string 10) ;; SCHEDULED: " " (match-string 11) ;; <-scheduled (match-string 12) ;; scheduled-time-stamp (match-string 13) )) ;; >-scheduled ((and (not (null (match-string 6))) ;; DEADLINE: (not (null (match-string 7))) ;; <-deadline (not (null (match-string 8))) ;; deadline-time-stamp (not (null (match-string 9))) ;; >-deadline (null (match-string 10)) ;; SCHEDULED: (null (match-string 11)) ;; <-scheduled (null (match-string 12)) ;; scheduled-time-stamp (null (match-string 13)) ) ;; >-scheduled (concat "/n " (match-string 6) ;; DEADLINE: " " (match-string 7) ;; <-deadline (match-string 8) ;; deadline-time-stamp (match-string 9)) ) ;; >-deadline ((and (null (match-string 6)) ;; DEADLINE: (null (match-string 7)) ;; <-deadline (null (match-string 8)) ;; deadline-time-stamp (null (match-string 9)) ;; >-deadline (not (null (match-string 10))) ;; SCHEDULED: (not (null (match-string 11))) ;; <-scheduled (not (null (match-string 12))) ;; scheduled-time-stamp (not (null (match-string 13))) ) ;; >-scheduled (concat "/n " (match-string 10) ;; SCHEDULED: " " (match-string 11) ;; <-scheduled (match-string 12) ;; scheduled-time-stamp (match-string 13)) )) ;; >-scheduled (when (not (null (match-string 14))) (concat "/n " (match-string 14))) ;; CLOSED: (when (not (null (match-string 15))) (concat "/n " (match-string 15))) ;; :PROPERTIES: (when (not (null (match-string 16))) (concat "/n " (match-string 16))) ;; :ToodledoID: (when (not (null (match-string 17))) (concat " " (match-string 17))) ;; id-string (when (not (null (match-string 18))) (concat "/n " (match-string 18))) ;; :ToodledoFolder: (when (not (null (match-string 19))) (concat " " (match-string 19))) ;; folder-name (when (not (null (match-string 20))) (concat "/n " (match-string 20))) ;; :HASH: (when (not (null (match-string 21))) (concat " " (match-string 21))) ;; hash-string (when (not (null (match-string 22))) (concat "/n " (match-string 22))) ;; :END: (when (not (null (match-string 23))) (concat "/n" (match-string 23))) )))) ;; notes