From 18dbd316ef55bed3418bd94407426f18ef1b01a0 Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Sat, 18 Jul 2026 15:50:24 -0500 Subject: 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. --- modules/music-config.el | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) (limited to 'modules') 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. -- cgit v1.2.3