Zhitao Gong <zhitaao.g...@gmail.com> writes: > I think there is a bug in org-sort or org-sort-list function. > > If you call org-sort (C-c ^) on list items, this function will call > org-sort-list. However, org-sort calls org-sort-list with only one > argument, i.e., the with-case (see the code below) > > #+BEGIN_SRC emacs-lisp > ((org-at-item-p) (org-call-with-arg 'org-sort-list with-case)) > #+END_SRC emacs-lisp
org-sort actually isn't calling org-sort-list with one argument; it's calling it interactively, while let-binding current-prefix-arg: (defsubst org-call-with-arg (command arg) "Call COMMAND interactively, but pretend prefix arg was ARG." (let ((current-prefix-arg arg)) (call-interactively command))) I'm a bit confused about why org-call-with-arg is necessary because I think call-interactively already propagates the current prefix argument, but perhaps I'm missing some subtlety here. Either way ... > The problem is that if you choose ?f (sorting with custom key function), > then org-sort-list expects another argument, the compare-func, which is > not passed to it. > > IMHO, there are two ways to solve this > > 1. Ask for the compare-func in org-sort-list, as it does for the > getkey-func. A default value could be provided for compare-func, > e.g., string<, <, etc. Or > 2. Restrict the return type to a string (or integer) so that we could > fix the compare-func I see it as a documentation issue. org-sort-list's docstring doesn't make it clear which part of the description applies to an interactive caller versus a Lisp caller. An interactive caller can choose the ?f sorting type, but they can't specify the compare-func. Entries are compared using sort-subr's default comparison behavior (see its docstring), and getkey-func has to return a value that's compatible with this behavior. And I think it's OK to not expose compare-func to the interactive caller. In cases where sort-subr's default behavior won't do and a user wants to supply a value for compare-func, they can create their own command that wraps a non-interactive org-sort-list call. What do you think? -- Kyle