branch: externals/org-remark commit 46d3722ea12e424ead3c1cf4b4db59b0f6d98e4a Author: Noboru Ota <m...@nobiot.com> Commit: Noboru Ota <m...@nobiot.com>
feat: Add om/next and /prev --- README.org | 8 +++++++- marginalia.org | 29 +++++++++++++++++++++++++--- org-marginalia.el | 57 +++++++++++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 84 insertions(+), 10 deletions(-) diff --git a/README.org b/README.org index 48a1ce22b9..6bb0dd180e 100644 --- a/README.org +++ b/README.org @@ -81,6 +81,12 @@ This command visits the marginalia file and load the saved highlights onto the c - =om/remove= :: This command removes the highlight at point. It will remove the highlight, and remove the properties from the marginalia, but will keep the headline and notes in tact. +- =om/next= (=C-c n ]= by default) :: +Move to the next highlight if any. If there is none below the cursor, and there is a highlight above, loop back to the top one. + +- =om/prev= (=C-c n [= by default) :: +Move to the previous highlight if any. If there is none above the cursor, and there is a highlight below, loop back to the bottom one. + * Customizing - You can customize settings in the =org-marginalia= group. @@ -116,7 +122,7 @@ Feedback welcome in this repo, or in [[https://org-roam.discourse.group/t/protot I am aiming to keep this package to be small and focused. I plan to add the following features, and probably consider it to be feature complete for my purposes. 1. =om/toggle-display= to toggle show/hide of highlights without losing them -2. =om/next= and =om/previous= to easily navigate highlighted regions in the buffer +2. DONE =om/next= and =om/prev= to easily navigate highlighted regions in the buffer * License diff --git a/marginalia.org b/marginalia.org index be3ab14ad1..191e21a53f 100644 --- a/marginalia.org +++ b/marginalia.org @@ -23,11 +23,34 @@ ** defun om/next :PROPERTIES: :marginalia-id: e0047cec -:marginalia-source-beg: 14856 -:marginalia-source-end: 14869 +:marginalia-source-beg: 15055 +:marginalia-source-end: 15068 :END: [[file:~/local-repos/org-marginalia/org-marginalia.el][org-marginalia]] =(view-file "marginalia.org")= is interesting. It visits the file with read-only mode on. Press q to quit. But if you turn off read-only-mode, you can then edt the buffer. -Also... It's useful to be able to cycle through (or view a list of) highlights. You may not see them. +Also... It's useful to be able to cycle through (or view a list of) highlights. You may not see them. + +For listing, built-in `tabulated-list-mode` exists. Additionallly, hierarchy.el, tablist.el, or lister.el (of publicimageltd, author of delve). + + + +** Author +:PROPERTIES: +:marginalia-id: f323a57f +:marginalia-source-beg: 143 +:marginalia-source-end: 149 +:END: +[[file:~/local-repos/org-marginalia/org-marginalia.el][org-marginalia]] + +** defun om/list-highlights-positions +[[file:~/local-repos/org-marginalia/org-marginalia.el][org-marginalia]] + +** om/sort-highlights-list () +:PROPERTIES: +:marginalia-id: 3be187c7 +:marginalia-source-beg: 18227 +:marginalia-source-end: 18253 +:END: +[[file:~/local-repos/org-marginalia/org-marginalia.el][org-marginalia]] diff --git a/org-marginalia.el b/org-marginalia.el index 2125179482..6ac9ae9103 100644 --- a/org-marginalia.el +++ b/org-marginalia.el @@ -202,6 +202,8 @@ the mode, `toggle' toggles the state." :keymap (let ((map (make-sparse-keymap))) (define-key map (kbd "C-c n o") #'om/open) (define-key map (kbd "C-c m") #'om/mark) + (define-key map (kbd "C-c ]") #'om/next) + (define-key map (kbd "C-c [") #'om/prev) map) (cond (org-marginalia-mode @@ -224,8 +226,8 @@ passed. If so, no new ID gets generated. Every highlighted texts in the local buffer is tracked by `om/highlights' local variable. The highlght is sorted by the -beginning point; this should be useful when `om/next' and -`om/previous' are implemented (not yet)." +beginning point in the ascending; this is useful for `om/next' +and `om/prev'." (interactive "r") ;; UUID is too long; does not have to be the full length (when (not id) (setq id (substring (org-id-uuid) 0 8))) @@ -356,11 +358,23 @@ marginalia, but will keep the headline and notes." (defun om/toggle-display () "WIP: Toggle showing/hiding of highlights in current bufer.") +(seq-find (lambda (p) (> p (point))) (om/list-highlights-positions) (nth 0 (om/list-highlights-positions) )) + (defun om/next () - "WIP.") + "Look at the current point, and move to the next highlight, if any. +If there is none below the point, but there is a highlight in the +buffer, go back to the first one." + (interactive) + (if (not om/highlights) (message "No highlights present in this buffer.") + (goto-char (om/find-next-highlight)))) -(defun om/previous () - "WIP.") +(defun om/prev () + "Look at the current point, and move to the previous highlight, if any. +If there is none above the point, but there is a highlight in the +buffer, go back to the last one." + (interactive) + (if (not om/highlights) (message "No highlights present in this buffer.") + (goto-char (om/find-prev-highlight)))) ;;;; Functions @@ -418,12 +432,43 @@ creat a new headline at the end of the buffer." (defun om/make-highlight-marker (point) "Return marker of the insertion-type t for POINT. The insertion-type is important in order for the highlight -position (beg and end points) in sycn with the highlited text +position (beg and end points) in sync with the highlighted text properties." (let ((marker (set-marker (make-marker) point))) (set-marker-insertion-type marker t) marker)) +(defun om/list-highlights-positions (&optional reverse) + "Return list of beg points of highlights in this buffer. +By default, the list is in ascending order. +If none, return nil. +If REVERSE is non-nil, return list in the descending order." + (when om/highlights + (let ((list (mapcar (lambda (h) + (marker-position (car (cdr h)))) + om/highlights))) + (if reverse (reverse list) list)))) + +(defun om/find-next-highlight () + "Return the beg point of the next highlight. +Look through `om/highlights' list." + + (when-let ((points (om/list-highlights-positions))) + ;; Find the first occurance of p > (point). If none, this means all the + ;; points occur before the current point. Take the first one. Assume + ;; `om/highlights' is sorted in the ascending order (it is). + (seq-find (lambda (p) (> p (point))) points (nth 0 points)))) + +(defun om/find-prev-highlight () + "Return the beg point of the previous highlight. +Look through `om/highlights' list (in descending order)." + + (when-let ((points (om/list-highlights-positions 'reverse))) + ;; Find the first occurance of p < (point). If none, this means all the + ;; points occur before the current point. Take the first one. Assume + ;; `om/highlights' is sorted in the descending order . + (seq-find (lambda (p) (< p (point))) points (nth 0 points)))) + ;;;; Footer (provide 'org-marginalia)