0

I try to set up a function that:

  1. Stores initial agenda view once (for resetting purpose)
  2. Reads user input for project name
  3. Creates several strings used for custom agenda parts
  4. Adds combined custom agenda to agenda list
  5. 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")
  )
Tietan
  • 95
  • 5

1 Answers1

0

You are quoting things like task-string, so you are using only those symbols, not their values.

Drew
  • 75,699
  • 9
  • 109
  • 225