From: No Wayman <iarchivedmywholelife@gmail.com>
To: emacs-orgmode@gnu.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 17:44:33 -0400 [thread overview]
Message-ID: <87tuwxyou6.fsf@gmail.com> (raw)
In-Reply-To: <87k0xt5fd6.fsf@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 489 bytes --]
No Wayman <iarchivedmywholelife@gmail.com> writes:
> It makes this sort of customization very simple
Famous last words. I forgot the agenda relies on text-properties
for much of its functionality.
I've attached a patch that addresses this and also removes the
`save-excursion` around the funcall to the custom insertion
function.
I've noted in the documentation that if the function is moving
point, it is responsible for making sure it ends up on the line
before the next habit.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: org-habit-insert-graph-function.0.0.2 --]
[-- Type: text/x-patch, Size: 3425 bytes --]
From 93496b6b86d73a95512c277a1321005d5f1995d1 Mon Sep 17 00:00:00 2001
From: Nicholas Vollmer <iarchivedmywholelife@gmail.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 | 45 ++++++++++++++++++++++++++++++++++-----------
1 file changed, 34 insertions(+), 11 deletions(-)
diff --git a/lisp/org-habit.el b/lisp/org-habit.el
index f76f0f213..99dfe8def 100644
--- a/lisp/org-habit.el
+++ b/lisp/org-habit.el
@@ -104,6 +104,27 @@ 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 the habit:
+
+ (setq org-habit-insert-graph-function
+ (lambda (graph)
+ (let ((props (text-properties-at (point))))
+ (end-of-line)
+ ;; org-agenda functionality depends on current line's text properties
+ (insert (concat \"\\n\" (make-string (1+ (or org-habit-graph-column 0)) ? )))
+ (add-text-properties (line-beginning-position) (line-end-position) props)
+ (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 +451,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
next prev parent reply other threads:[~2020-08-20 21:45 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-08-20 18:41 [PATCH] org-habit: custom consistency graph placement [9.3.7 (release_9.3.7-716-g6d5cab @ /home/n/.emacs.d/straight/build/org/)] No Wayman
2020-08-20 18:46 ` No Wayman
2020-08-20 21:44 ` No Wayman [this message]
2020-08-20 22:29 ` Ihor Radchenko
2020-08-21 3:12 ` No Wayman
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 \
--in-reply-to=87tuwxyou6.fsf@gmail.com \
--to=iarchivedmywholelife@gmail.com \
--cc=emacs-orgmode@gnu.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
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public 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 read-only IMAP folder(s) and NNTP newsgroup(s).