emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] Org Agenda Support Argument Collection for Custom Bulk Funct


From: Kyle Meyer
Subject: Re: [PATCH] Org Agenda Support Argument Collection for Custom Bulk Functions (was: Custom Bulk Functions With Prompt)
Date: Sun, 14 Feb 2021 15:23:49 -0500

Kevin Foley writes:

> Kyle Meyer <kyle@kyleam.com> writes:
>
>>   (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
[...]
> Side note I'm not sure your example would render properly regardless
> since `my/bulk-action' and `my/args' aren't functions.

I'm confused by this.  They were defined just above the text you quoted:

  (defun my/bulk-action (&rest args)
    args)

  (defun my/args ()
    (list 1 2 3))

  (setq org-agenda-bulk-custom-functions
  [...]

Either way, your latest defcustom type as well as the rest of the
update, aside from the issue I note below, looks good to me.  Thanks.

> @@ -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)))))

Aren't the pcase-let bindings missing a set of parentheses?

  (pcase-let (`(,_ ,fn ,arg-fn)
              (list 1 2 3))
    (list fn arg-fn))  ; let: Invalid function: (\, _)

  (pcase-let ((`(,_ ,fn ,arg-fn)
               (list 1 2 3)))
    (list fn arg-fn))  ; => (2 3)

However, I don't see using pcase-let here as an improvement.  Admittedly
it's mostly subjective, but I think it's unhelpfully permissive for this
use case:

  (pcase-let ((`(,a ,b) (list 1 2 3 4)))
    (list a b))  ; => (1 2)

Fwiw, here's a relevant emacs.devel thread:
https://lists.gnu.org/archive/html/emacs-devel/2015-07/msg00103.html
(message ID: <jwvegkfoniv.fsf-monnier+emacs@gnu.org>)

My pcase-based suggestion, on top of your patch, is below.  If that
looks okay to you, there's no need to resend; I can squash it in.

diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el
index 42d127232..d6499e6b0 100644
--- a/lisp/org-agenda.el
+++ b/lisp/org-agenda.el
@@ -10502,14 +10502,15 @@ (defun org-agenda-bulk-action (&optional arg)
                (completing-read "Function: " obarray #'fboundp t nil nil))))
 
        (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)))))
+         (setq cmd
+               (pcase (assoc action org-agenda-bulk-custom-functions)
+                 (`(,_ ,fn)
+                  fn)
+                 (`(,_ ,fn ,arg-fn)
+                  (apply #'apply-partially fn (funcall arg-fn)))
+                 (_
+                  (user-error "Invalid bulk action: %c" action))))
+         (setq redo-at-end t)))
       ;; Sort the markers, to make sure that parents are handled
       ;; before children.
       (setq entries (sort entries



reply via email to

[Prev in Thread] Current Thread [Next in Thread]