From 1d09a90abcb4136a3cf7562870f7eda831f163d3 Mon Sep 17 00:00:00 2001 From: "Kevin J. Foley" Date: Thu, 21 Jan 2021 08:48:52 -0500 Subject: [PATCH] org-agenda.el: Support argument collection for custom bulk functions * lisp/org-agenda.el (org-agenda-bulk-custom-functions): Add documentation about argument collection for custom bulk functions. (org-agenda-bulk-action): Support function to collect arguments for custom bulk functions. * etc/ORG-NEWS (Option ~org-agenda-bulk-custom-functions~ now supports collecting bulk arguments): Add entry to NEWS. --- etc/ORG-NEWS | 7 ++++++- lisp/org-agenda.el | 29 +++++++++++++++++++++++++---- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index 5e5f1954d..4958d2b2e 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -81,8 +81,13 @@ block. ~org-babel-latex-preamble~, ~org-babel-latex-begin-env~ and the user to specify the preamble and code that preceedes and proceeds the contents of the source block. +*** Option ~org-agenda-bulk-custom-functions~ now supports collecting bulk arguments + +When specifying a custom agenda bulk option, you can now also specify a function which collects the arguments to be used with each call to the custom function. + + ** New features -*** =ob-python= improvements to =:return= header argument +*** =ob-python= improvements to =:return= header argument The =:return= header argument in =ob-python= now works for session blocks as well as non-session blocks. Also, it now works with the diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el index dedf7e5bb..c5c1b54ba 100644 --- a/lisp/org-agenda.el +++ b/lisp/org-agenda.el @@ -2080,9 +2080,25 @@ (defcustom org-agenda-bulk-custom-functions nil With selected entries in an agenda buffer, `B R' will call the custom function `set-category' on the selected entries. -Note that functions in this alist don't need to be quoted." - :type '(alist :key-type character :value-type (group function)) - :version "24.1" +Note that functions in this alist don't need to be quoted. + +If the custom function accepts arguments which you'd like to +collect once from the user to be used for each call, you can pass +a list with the bulk function, and the function which collects +its arguments and returns them as a list. For example: + + \\='((?R (set-category get-category)) + (?C bulk-cut)) + +Now, `B R' will call the custom `get-category' which would prompt +the user once for a category. That category is then passed as an +argument to `set-category' for each entry it's called against. +" + :type '(alist :key-type character + :value-type (list (function :tag "Bulk Custom Function") + (choice (const :tag "No Bulk Custom Argument Function" nil) + (function :tag "Bulk Custom Argument Function")))) + :package-version '(Org . "9.5") :group 'org-agenda) (defmacro org-agenda-with-point-at-orig-entry (string &rest body) @@ -10487,7 +10503,12 @@ (defun org-agenda-bulk-action (&optional arg) (action (pcase (assoc action org-agenda-bulk-custom-functions) - (`(,_ ,f) (setq cmd f) (setq redo-at-end t)) + (`(,_ ,f) + (when (listp f) + (let ((args (when (nth 1 f) (funcall (nth 1 f)))) + (func (nth 0 f))) + (setq f (apply #'apply-partially func args)))) + (setq cmd f) (setq redo-at-end t)) (_ (user-error "Invalid bulk action: %c" action))))) ;; Sort the markers, to make sure that parents are handled -- 2.28.0