Extended syntax for hydra docstrings
04 Apr 2016I've been getting more and more organized in tracking my tasks and time with Org-mode. Still using the usual suspects, of course: GTD and Pomodoro, I'm just getting more diligent with them than in the previous years.
So today I wanted to prettify the good old
org-agenda-view-mode-dispatch, which is bound to v in
org-agenda-mode. Currently, it's just a boring static message and
read-char combination. Why not do it with a
hydra instead?
Here's the current full code, that uses the newly extended doc syntax:
(define-key org-agenda-mode-map
"v" 'hydra-org-agenda-view/body)
(defun org-agenda-cts ()
(let ((args (get-text-property
(min (1- (point-max)) (point))
'org-last-args)))
(nth 2 args)))
(defhydra hydra-org-agenda-view (:hint none)
"
_d_: ?d? day _g_: time grid=?g? _a_: arch-trees
_w_: ?w? week _[_: inactive _A_: arch-files
_t_: ?t? fortnight _f_: follow=?f? _r_: report=?r?
_m_: ?m? month _e_: entry =?e? _D_: diary=?D?
_y_: ?y? year _q_: quit _L__l__c_: ?l?"
("SPC" org-agenda-reset-view)
("d" org-agenda-day-view
(if (eq 'day (org-agenda-cts))
"[x]" "[ ]"))
("w" org-agenda-week-view
(if (eq 'week (org-agenda-cts))
"[x]" "[ ]"))
("t" org-agenda-fortnight-view
(if (eq 'fortnight (org-agenda-cts))
"[x]" "[ ]"))
("m" org-agenda-month-view
(if (eq 'month (org-agenda-cts)) "[x]" "[ ]"))
("y" org-agenda-year-view
(if (eq 'year (org-agenda-cts)) "[x]" "[ ]"))
("l" org-agenda-log-mode
(format "% -3S" org-agenda-show-log))
("L" (org-agenda-log-mode '(4)))
("c" (org-agenda-log-mode 'clockcheck))
("f" org-agenda-follow-mode
(format "% -3S" org-agenda-follow-mode))
("a" org-agenda-archives-mode)
("A" (org-agenda-archives-mode 'files))
("r" org-agenda-clockreport-mode
(format "% -3S" org-agenda-clockreport-mode))
("e" org-agenda-entry-text-mode
(format "% -3S" org-agenda-entry-text-mode))
("g" org-agenda-toggle-time-grid
(format "% -3S" org-agenda-use-time-grid))
("D" org-agenda-toggle-diary
(format "% -3S" org-agenda-include-diary))
("!" org-agenda-toggle-deadlines)
("["
(let ((org-agenda-include-inactive-timestamps t))
(org-agenda-check-type t 'timeline 'agenda)
(org-agenda-redo)))
("q" (message "Abort") :exit t))
And here's how it looks like in action, I simply pressed v while in the agenda:

Since many functions that org-agenda-view-mode-dispatch calls are
toggles, it makes sense for hydra-org-agenda-view to display the
status of these toggles.
And it's actually convenient to toggle a whole lot of things at once, and the default red hydra keys really come in handy here.
Quick explanation of the syntax
Each head of a hydra looks like:
(key cmd &optional doc &rest plist)
The fairly new bit that I'm using here is the ability to use a sexp
instead of a plain string in the doc part. This sexp will be
evaluated each time the doc is re-displayed. This means that it can
represent a changing variable, for instance the state of a minor mode
or a variable.
And here's the best part: the doc of each head can be quoted in the
hydra's docstring by using the corresponding key, e.g. ?g?. This
allows to have very complex docstrings while keeping them easily
aligned in a tabular format.
Here is only the hydra's docstring, copied from the above code:
_d_: ?d? day _g_: time grid=?g? _a_: arch-trees
_w_: ?w? week _[_: inactive _A_: arch-files
_t_: ?t? fortnight _f_: follow=?f? _r_: report=?r?
_m_: ?m? month _e_: entry =?e? _D_: diary=?D?
_y_: ?y? year _q_: quit _L__l__c_: ?l?
Doesn't that look simple?