Extended syntax for hydra docstrings04 Apr 2016
I'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
read-char combination. Why not do it with a
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 nil) " _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.
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?