From 41ee2b974a98e0beac00a8012eab91cec948e6d5 Mon Sep 17 00:00:00 2001 From: Nicholas Vollmer Date: Thu, 20 Aug 2020 13:46:49 -0400 Subject: [PATCH] habit: add custom option for placing consistency graph * lisp/org-habit.el (org-habit-insert-consistency-graphs): Add `org-habit-insert-graph-function' defcustom. Allow user to control consistency graph placement with a customizable function. See `org-habit-insert-graph-function` docstring for an example. --- lisp/org-habit.el | 51 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/lisp/org-habit.el b/lisp/org-habit.el index f76f0f213..55577f442 100644 --- a/lisp/org-habit.el +++ b/lisp/org-habit.el @@ -104,6 +104,33 @@ means of creating calendar-based reminders." :package-version '(Org . "9.3") :safe (lambda (v) (or (integerp v) (null v)))) +(defcustom org-habit-insert-graph-function nil + "Function called to place each consistency graph. +It must accept the graph string as its sole argument. +It is invoked with point on the current habit's line in the agenda +buffer, and is responsible for placing point on the line before the +next habit if point is moved. + +For example, to insert graphs on a new line below each habit: + +\(setq org-habit-insert-graph-function + (lambda (graph) + \"Place org habit consitency on its own line below the habit.\" + (add-text-properties + (line-beginning-position) (line-end-position) + \\=`(display ,(concat + (when-let ((icon (car (org-agenda-get-category-icon + (org-agenda-get-category))))) + + (format \" %s \" icon)) + (string-trim-left (thing-at-point \\='line)) + (make-string (or org-habit-graph-column 0) ? ) + (insert graph)))))) + +If nil, the graph is inserted on the current habit's line at `org-habit-graph-column'." + :group 'org-habit + :type 'function) + (defface org-habit-clear-face '((((background light)) (:background "#8270f9")) (((background dark)) (:background "blue"))) @@ -430,17 +457,19 @@ current time." (while (not (eobp)) (let ((habit (get-text-property (point) 'org-habit-p))) (when habit - (move-to-column org-habit-graph-column t) - (delete-char (min (+ 1 org-habit-preceding-days - org-habit-following-days) - (- (line-end-position) (point)))) - (insert-before-markers - (org-habit-build-graph - habit - (time-subtract moment (days-to-time org-habit-preceding-days)) - moment - (time-add moment (days-to-time org-habit-following-days)))))) - (forward-line))))) + (let ((graph (org-habit-build-graph + habit + (time-subtract moment (days-to-time org-habit-preceding-days)) + moment + (time-add moment (days-to-time org-habit-following-days))))) + (if (functionp org-habit-insert-graph-function) + (funcall org-habit-insert-graph-function graph) + (move-to-column org-habit-graph-column t) + (delete-char (min (+ 1 org-habit-preceding-days + org-habit-following-days) + (- (line-end-position) (point)))) + (insert-before-markers graph))))) + (forward-line))))) (defun org-habit-toggle-habits () "Toggle display of habits in an agenda buffer." -- 2.28.0