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?