I try to set up a function that:
- Stores initial agenda view once (for resetting purpose)
- Reads user input for project name
- Creates several strings used for custom agenda parts
- Adds combined custom agenda to agenda list
- Shows the generated agenda
The code I've come up with so far is this:
(defun tietan/project-agenda ()
(interactive)
(let
((project (read-string "Enter Project: "))
(taskstring)
(packagestring)
(donestring))
(setq taskstring (concat "PROJECT=\"" project "\"" ))
(setq packagestring (concat "PROJECT=\"" project "\"" "+TYPE=\"Package\"-STATE=\"Finished\""))
(setq donestring (concat "PROJECT=\"" project "\"" "+TYPE=\"Package\"-STATE=\"Finished\"+TODO=\"DONE\""))
;; only save intial agenda if not already done once
(cond ((not (boundp 'temp-org-agenda)) (setq temp-org-agenda org-agenda-custom-commands)))
(message project)
(message taskstring)
(message donestring)
(message packagestring)
(add-to-list 'org-agenda-custom-commands
'("X" (concat "Function Agenda (" project ")")
((tags (concat packagestring)
((org-agenda-overriding-header "Packages")
(org-agenda-sorting-strategy '(tag-up priority-down todo-state-down))
))
(tags-todo 'taskstring
((org-agenda-overriding-header "Tasks")
(org-agenda-sorting-strategy '(tag-up priority-down todo-state-down))
))
(tags 'donestring
((org-agenda-overriding-header "Done Tasks")
(org-agenda-sorting-strategy '(tag-up priority-down todo-state-down))
))
)
((org-agenda-overriding-columns-format "%30ITEM(Subject) %2PRIORITY(#) %STATE %CLOCKSUM %PROJECT")
(org-agenda-view-columns-initially t))))
)
)
So as you may see the debugging (message ...)
calls are there to give me a hint if my concatenation and user input works. The output with "Snake" as input would be:
PROJECT="Snake"
PROJECT="Snake"+TYPE="Package"-STATE="Finished"+TODO="DONE"
PROJECT="Snake"+TYPE="Package"-STATE="Finished"
But the problem is that this is not evaluated in the (add-to-list ...)
command.
The value of org-agenda-custom-commands
is:
(("X"
(concat "Function Agenda (" project ")")
((tags
(concat packagestring)
((org-agenda-overriding-header "Packages")
(org-agenda-sorting-strategy
'(tag-up priority-down todo-state-down))))
(tags-todo 'taskstring
((org-agenda-overriding-header "Tasks")
(org-agenda-sorting-strategy
'(tag-up priority-down todo-state-down))))
(tags 'donestring
((org-agenda-overriding-header "Done Tasks")
(org-agenda-sorting-strategy
'(tag-up priority-down todo-state-down)))))
((org-agenda-overriding-columns-format "%30ITEM(Subject) %2PRIORITY(#) %STATE %CLOCKSUM %PROJECT")
(org-agenda-view-columns-initially t)))
Is there any way to store the evaluated value/string into org-agenda-custom-commands
?
Solution:
Thanks to Drew's comment. I got the solution ready. Feel free to use if you want.
(defun tietan/project-agenda ()
(interactive)
(let
((project (read-string "Enter Project: "))
(taskstring)
(packagestring)
(donestring))
(setq taskstring (concat "PROJECT=\"" project "\"" ))
(setq packagestring (concat "PROJECT=\"" project "\"" "+TYPE=\"Package\"-STATE=\"Finished\""))
(setq donestring (concat "PROJECT=\"" project "\""))
;; only save intial agenda if not already done once otherwise reset
(cond ((not (boundp 'temp-org-agenda)) (setq temp-org-agenda org-agenda-custom-commands))
((boundp 'temp-org-agenda) (setq org-agenda-custom-commands temp-org-agenda)))
(add-to-list 'org-agenda-custom-commands
`("X" "Function Agenda"
((tags ,packagestring
((org-agenda-overriding-header "Packages")
(org-agenda-sorting-strategy '(tag-up priority-down todo-state-down))
))
(tags-todo ,taskstring
((org-agenda-overriding-header "Tasks")
(org-agenda-sorting-strategy '(todo-state-down))
))
(tags ,donestring
((org-agenda-overriding-header "Done Tasks")
(org-agenda-sorting-strategy '(scheduled-up todo-state-down priority-down ))
(org-agenda-skip-function '(org-agenda-skip-entry-if 'nottodo '("DONE" "CANCELLED")))
))
)
((org-agenda-overriding-columns-format "%TODO %30ITEM(Subject) %2PRIORITY(#) %STATE %CLOCKSUM %PROJECT %TAGS")
(org-agenda-view-columns-initially t))))
)
(org-agenda nil "X")
)