aboutsummaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-07-18 15:50:24 -0500
committerCraig Jennings <c@cjennings.net>2026-07-18 15:50:24 -0500
commit18dbd316ef55bed3418bd94407426f18ef1b01a0 (patch)
tree8c95335793730346bab7577adbfe43e8c6fe9626 /modules
parent97445c8b04327317d617fde7be664a82230f3fb5 (diff)
downloaddotemacs-18dbd316ef55bed3418bd94407426f18ef1b01a0.tar.gz
dotemacs-18dbd316ef55bed3418bd94407426f18ef1b01a0.zip
feat(music): mark the current playlist row on its number
Emacs draws the filled cursor only in the selected window, and the playlist dock is glanced at from other windows constantly. The pinned cursor was invisible exactly when it was wanted. The current row's number now renders in inverse video, updated as point moves and re-applied after each renumber. The mark shows whether or not the window has focus, and the row band from hl-line was already sticky.
Diffstat (limited to 'modules')
-rw-r--r--modules/music-config.el38
1 files changed, 36 insertions, 2 deletions
diff --git a/modules/music-config.el b/modules/music-config.el
index bff0f5ce..e9f7c2bb 100644
--- a/modules/music-config.el
+++ b/modules/music-config.el
@@ -364,7 +364,8 @@ that right-aligns the metadata drifts point to arbitrary visual columns
and snaps every landing back to the row start. An active isearch owns
point until it ends; the snap lands when the search exits."
(unless (or (bolp) (bound-and-true-p isearch-mode))
- (beginning-of-line)))
+ (beginning-of-line))
+ (cj/music--highlight-current-number))
(defvar-local cj/music--renumber-timer nil
"Pending idle timer for the playlist row renumber, or nil.")
@@ -401,7 +402,40 @@ debounce timer can outlive the playlist buffer."
(propertize (format "%3d " n)
'face 'cj/music-keyhint-face
'cursor t))))
- (forward-line 1))))))))
+ (forward-line 1))))
+ ;; The rebuild deleted the marked overlay; re-mark the current row.
+ (setq cj/music--current-number-overlay nil)
+ (cj/music--highlight-current-number)))))
+
+(defvar-local cj/music--current-number-overlay nil
+ "The number overlay currently rendered as the you-are-here mark, or nil.")
+
+(defun cj/music--set-number-face (ov current)
+ "Re-render number overlay OV's string; CURRENT non-nil marks it inverse.
+Keeps the text and the cursor property, swaps only the face."
+ (let ((s (overlay-get ov 'before-string)))
+ (overlay-put ov 'before-string
+ (propertize (substring-no-properties s)
+ 'face (if current
+ '(:inherit cj/music-keyhint-face :inverse-video t)
+ 'cj/music-keyhint-face)
+ 'cursor t))))
+
+(defun cj/music--highlight-current-number ()
+ "Render the current row's number in inverse video, restoring the last one.
+The block cursor draws only in the selected window, and the playlist dock
+is glanced at from other windows constantly, so the number itself carries
+the you-are-here mark -- visible whether or not the window has focus."
+ (let ((ov (seq-find (lambda (o) (overlay-get o 'cj-music-row-number))
+ (overlays-in (line-beginning-position)
+ (min (1+ (line-beginning-position)) (point-max))))))
+ (unless (eq ov cj/music--current-number-overlay)
+ (when (and (overlayp cj/music--current-number-overlay)
+ (overlay-buffer cj/music--current-number-overlay))
+ (cj/music--set-number-face cj/music--current-number-overlay nil))
+ (setq cj/music--current-number-overlay ov)
+ (when ov
+ (cj/music--set-number-face ov t)))))
(defun cj/music--schedule-renumber (&rest _)
"Debounced renumber of the current playlist buffer after a text change.