Toby Cubitt <ts...@cantab.net> writes: >> I still think functions are the way to go. Three options in the >> defcustom: >> >> - One to provide regular time (i.e 14:40 or 3d 18:32) >> >> - One to provide decimal time with the highest unit available (i.e. >> 18,75 h or 2,5 d). >> >> - One free slot for an user-defined function. > > I like the flexibility of functions. But one drawback of this is that you > can't produce your "5 h 32 min" or "5,3 days" examples without defining a > new function. > > It would be nice if tweaking just the format (without > changing the numbers themselves) could be done by changing a simple > format string. > > Because the number of placeholders in a format string is fixed, I don't > see how to avoid the need for multiple format strings. Perhaps we need a > second defcustom that holds a list of format strings, to be used by the > functions in your first two choices. > > The first format string for durations < 1 day (or for all durations if > this is the only string in the list), the second for durations >= 1 day. > One nice thing is that this could easily be extended in the obvious way > if one wanted to allow different formats for durations >= 1 month or >>= 1 year. > > It's slightly ugly that the defaults for the format-string defcustom > would have to change depending on the value of the function defcustom. I > guess one could either have the format-string defcustom default to nil, > and use hard-coded defaults in the functions (which are overridden by a > non-nil format string value). Or put both functions and format strings > into a single defcustom, e.g. as a list with the function in the first > element.
Actually the number of functions defined doesn't matter much. What matters is the number of functions exposed to the end-user, which is 0 in this situation (or 1 if he decides to write his own). Here, all is solved with one defcustom. You don't even need to create multiple functions for that. The defcustom can store `regular', `decimal' symbols or a function. Then you can write a generic duration format function that will be used across code base with the following template: #+begin_src emacs-lisp (defun org-build-format-duration (n) "Format duration N according to `org-duration-format' variable. N is the duration to display, as a number, expressed in minutes. Return formatted duration as a string." (cond ((functionp org-duration-format) (funcall org-duration-format)) ((eq org-duration-format 'regular) ...) ((eq org-duration-format 'decimal) ...) (t (error "Invalid `org-duration-format' value")))) #+end_src One variable exposed to the user. One function exposed to the developer. It's much simpler. Regards, -- Nicolas Goaziou