Tor-björn Claesson <tclaes...@gmail.com> writes:

> Here is attached a new version of the patch for review. NEWS, commit
> message and docstrings are placeholders until we get the code right.
>
> The parameters of the menu are now customiseable, we have org-menu-mode,
> and I have been using the current version for a couple of days writing my
> thesis-book without problem.

Thanks!
I have some comments.

> I have not tested using a menu system other than transient. What would be a
> good candidate for this?

Probably which-key (it is built-in). 

> +(org-menu-define org-cite-basic-follow (citation-object)
> +                 "Follow citations"

You can use (declare (indent defun)) in macro definition to make the
indentation work as in defun. See various macros in org-macs.el as examples.

> +                 '[["Open"

Is quote necessary here?

> +                    ("b" "bibliography entry" (org-cite-basic-goto 
> !citation-object !prefix))]
> ...
> +                 :default-action 'org-cite-basic-goto

There is inconsistency here.
You can specify the exact arguments passed to menu-actions, but not to
default action. I think that :default-action should follow a shortened
menu-action spec.

> +                   ["Copy"
> +                    ("d" "DOI"
> +                     (let ((doi (org-cite-basic--get-field
> +                                 'doi
> +                                 (org-cite-basic--get-key 
> !citation-object))))
> +                       (if (not (s-blank? doi))
> +                           (kill-new doi)
> +                         (user-error "No DOI for `%s'" 
> (org-cite-basic--get-key !citation-object)))))

Anonymous action definition is good for testing, but we should factor it
out to a separate function at the end.

> +                   ["Browse"
> +                    ("w" "Browse URL/DOI"

Maybe it should be under "Open" section as well.

> +                 :parameter-types ('citation 'citation-reference))

I believe the :parameter-types is way too specific for menu system for
be truly generic. Imagine if someone wants to have more than one
argument in a menu: (org-menu-define test (arg1 arg2 &optional arg3)
Rather than implicitly defining interactive spec as in

> +         (interactive
> +          (list (let ((obj (org-element-context)))
> +                  (pcase (org-element-type obj)
> +                    ((or ,@types) obj)
> +                    (_ (user-error "Wrong object type"))))))

you should let the caller handle interactive spec and other
argument pre-processing.

> +(cl-defmacro org-menu-define (name
> +                              arglist
> +                              docstring
> +                              contents
> +                              &key ((:default-action default-action) nil)
> +                              &key ((:parameter-types types) nil))

I suggest adding &rest body to the macro definition
and then placing that body directly before
> + (cond ((not (xor org-menu-mode

WDYT?

> +(defun org-menu--wrap-specification (specification arg-list)
> +  "Handle special syntax for `org-cite-basic-follow-actions'."

Please describe in details what this special syntax as and what the
return value is.

> +
> +;;; Main macro definition
> +(cl-defmacro org-menu-define (name
> +                              arglist
> +                              docstring
> +                              contents
> +                              &key ((:default-action default-action) nil)
> +                              &key ((:parameter-types types) nil))
> ...
> +        (complete-arglist (if (member 'prefix arglist)
> +                              arglist
> +                              `(,@arglist prefix))))
> +    `(progn
> +
> +;;; Local customization

You are overdoing the page breaks and comments.
Please do not split macro body with section comments and page breaks.
Instead, I recommend defining a set of helper macros:
1. For each defcustom
2. For defun
3. for transient-define-suffic

Then, you can easily separate code for and place comments without
breaking a defmacro body.

> +       (defcustom ,menu-actions ,contents
> +         ,(concat "Actions in the `"
> +                  (symbol-name name)
> +                  "' org menu.
> +
> +This option uses the same syntax as `transient-define-prefix', see Info node
> +`(transient)Binding Suffix and Infix Commands'. In addition, it is possible
> +to specify a function call for the COMMAND part, where ARGUMENTS can be used
> +to access those values.")
> +         :group 'org-menu
> +         :package-version '(Org . "9.8")

:package-version makes no sense here.

Also, it is a good idea to provide some examples in the docstring.
For users and also to make sure that we understand the org-menu design
ourselves :)

-- 
Ihor Radchenko // yantar92,
Org mode maintainer,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>

Reply via email to