Kyle Meyer <[email protected]> writes:
> Please fill this line (fill-column in .dir-locals.el is set to 70)
> and...
>> [...]
> ... drop this unrelated space change.
Done and done.
> Reading this docstring in full, I felt it was a bit odd to repeat the
> bulk-cut entry from the initial example again, as it stays the same and
> isn't relevant. So perhaps something like this would be clearer:
>
> ... and returns them as a list. For example, the first
> entry in the above example could be extended as
>
> (?R (set-category get-category))
>
> Now, `B R' will ...
>
> Or perhaps not. I'm okay with it either way and will leave that up to
> you.
I agree, I've removed it.
> Please drop the new line before the closing quote.
Done.
> convention nit: It'd be good to reflow the type to not go beyond ~80
> columns.
Fixed.
>> + :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"))))
> This type looks like it's specifying a format that isn't supported by
> org-agenda-bulk-action:
> [...]
> I think it'd probably end up a bit cleaner if you go with (key fn
> [arg-fn])
I ended up moving to this structure and changing the pcase to a
pcase-let which I think makes things a bit cleaner, let me know your
thoughts.
> (setq org-agenda-bulk-custom-functions
> '((?D my/bulk-action)
> (?E (my/bulk-action))
> (?F (my/bulk-action my/args))))
> However, customize doesn't render the above value properly
I believe I have the type correct for the new layout. For example the
following renders correctly:
(setq org-agenda-bulk-custom-functions
'((?a ignore)
(?b ignore nil)
(?c ignore ignore)))
Side note I'm not sure your example would render properly regardless
since `my/bulk-action' and `my/args' aren't functions.
Cheers,
Kevin Foley
>From 3d5dc61c1565695e797936af1f2eb50cd5460c95 Mon Sep 17 00:00:00 2001
From: "Kevin J. Foley" <[email protected]>
Date: Sat, 13 Feb 2021 12:04:38 -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 | 34 +++++++++++++++++++++++++++-------
2 files changed, 34 insertions(+), 7 deletions(-)
diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index 5e5f1954d..d7de97e2c 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -81,6 +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
diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el
index dedf7e5bb..42d127232 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.
+
+You can also specify a function which collects arguments to be
+used for each call to your bulk custom function. The argument
+collecting function will be run once and should return a list of
+arguments to pass to the bulk function. For example:
+
+ \\='((?R set-category get-category))
+
+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
+ (group (function :tag "Bulk Custom Function")
+ (choice (function :tag "Bulk Custom Argument Function")
+ (const :tag "No Bulk Custom Argument Function" nil))))
+ :package-version '(Org . "9.5")
:group 'org-agenda)
(defmacro org-agenda-with-point-at-orig-entry (string &rest body)
@@ -10486,10 +10502,14 @@ (defun org-agenda-bulk-action (&optional arg)
(completing-read "Function: " obarray #'fboundp t nil nil))))
(action
- (pcase (assoc action org-agenda-bulk-custom-functions)
- (`(,_ ,f) (setq cmd f) (setq redo-at-end t))
- (_ (user-error "Invalid bulk action: %c" action)))))
-
+ (pcase-let (`(,_ ,fn ,arg-fn)
+ (assoc action org-agenda-bulk-custom-functions))
+ (if (not fn)
+ (user-error "Invalid bulk action: %c" action)
+ (when (functionp arg-fn)
+ (setq fn (apply #'apply-partially fn (funcall arg-fn))))
+ (setq cmd fn)
+ (setq redo-at-end t)))))
;; Sort the markers, to make sure that parents are handled
;; before children.
(setq entries (sort entries
--
2.28.0