diff options
Diffstat (limited to 'modules/music-config.el')
| -rw-r--r-- | modules/music-config.el | 38 |
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. |
