From: No Wayman <firstname.lastname@example.org> To: Ihor Radchenko <email@example.com> Cc: firstname.lastname@example.org Subject: Re: [PATCH] org-habit: custom consistency graph placement [9.3.7 (release_9.3.7-716-g6d5cab @ /home/n/.emacs.d/straight/build/org/)] Date: Thu, 20 Aug 2020 23:12:20 -0400 [thread overview] Message-ID: <email@example.com> (raw) In-Reply-To: <87tuwx3q91.fsf@localhost> [-- Attachment #1: Type: text/plain, Size: 1171 bytes --] Ihor Radchenko <firstname.lastname@example.org> writes: > As I remember, last time I played with multi-line agenda > entries, there > were issues with org-agenda-next/previous-item. You may consider > checking if your patch breaks those. Thanks for the heads up, Ihor. The patch itself shouldn't break anything and is completely optional behavior, though the example I gave in the docstring does. I ended up faking the newline with the display text-property: (defun +org-habit-graph-on-own-line (graph) "Place org habit consitency graph 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) ? ) (propertize graph 'display '(height (+ 1))))))) This works well for me so far. I've revised the docstring attachment in the attached patch. [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: org-habit-insert-graph-function.0.0.3 --] [-- Type: text/x-patch, Size: 3620 bytes --] From 41ee2b974a98e0beac00a8012eab91cec948e6d5 Mon Sep 17 00:00:00 2001 From: Nicholas Vollmer <email@example.com> 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
prev parent reply other threads:[~2020-08-21 3:12 UTC|newest] Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-08-20 18:41 No Wayman 2020-08-20 18:46 ` No Wayman 2020-08-20 21:44 ` No Wayman 2020-08-20 22:29 ` Ihor Radchenko 2020-08-21 3:12 ` No Wayman [this message]
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style List information: https://www.orgmode.org/ * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --firstname.lastname@example.org \ --email@example.com \ --firstname.lastname@example.org \ --email@example.com \ --subject='Re: [PATCH] org-habit: custom consistency graph placement [9.3.7 (release_9.3.7-716-g6d5cab @ /home/n/.emacs.d/straight/build/org/)]' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Code repositories for project(s) associated with this inbox: https://git.savannah.gnu.org/cgit/emacs/org-mode.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).