summaryrefslogtreecommitdiff
path: root/modules/ui-config.el
diff options
context:
space:
mode:
Diffstat (limited to 'modules/ui-config.el')
-rw-r--r--modules/ui-config.el48
1 files changed, 25 insertions, 23 deletions
diff --git a/modules/ui-config.el b/modules/ui-config.el
index 91dbaf31..775aefb2 100644
--- a/modules/ui-config.el
+++ b/modules/ui-config.el
@@ -36,11 +36,8 @@
"Opacity level for Emacs frames when `cj/enable-transparency' is non-nil.
100 = fully opaque, 0 = fully transparent.")
-(defconst cj/cursor-colors
- '((read-only . "#f06a3f") ; red – buffer is read-only
- (overwrite . "#c48702") ; gold – overwrite mode
- (normal . "#64aa0f")) ; green – insert & read/write
- "Alist mapping cursor states to their colors.")
+;; Use buffer status colors from user-constants
+(require 'user-constants)
;; ----------------------------- System UI Settings ----------------------------
@@ -53,7 +50,8 @@
(setq use-file-dialog nil) ;; no file dialog
(setq use-dialog-box nil) ;; no dialog boxes either
-(column-number-mode 1) ;; show column number in the modeline
+(line-number-mode 1) ;; show line number in the modeline (cached)
+(column-number-mode 1) ;; show column number in the modeline (cached)
(setq switch-to-buffer-obey-display-actions t) ;; manual buffer switching obeys display action rules
;; -------------------------------- Transparency -------------------------------
@@ -99,23 +97,27 @@ When `cj/enable-transparency' is nil, reset alpha to fully opaque."
"Last buffer name where cursor color was applied.")
(defun cj/set-cursor-color-according-to-mode ()
- "Change cursor color according to \\='buffer-read-only or \\='overwrite state."
- (let* ((state (cond
- (buffer-read-only 'read-only)
- (overwrite-mode 'overwrite)
- (t 'normal)))
- (color (alist-get state cj/cursor-colors)))
- (unless (and (string= color cj/-cursor-last-color)
- (string= (buffer-name) cj/-cursor-last-buffer))
- (set-cursor-color color)
- (setq cj/-cursor-last-color color
- cj/-cursor-last-buffer (buffer-name)))))
-
-;; Use more efficient hooks instead of post-command-hook for better performance
-(add-hook 'window-buffer-change-functions
- (lambda (_window) (cj/set-cursor-color-according-to-mode)))
-(add-hook 'read-only-mode-hook #'cj/set-cursor-color-according-to-mode)
-(add-hook 'overwrite-mode-hook #'cj/set-cursor-color-according-to-mode)
+ "Change cursor color according to buffer state (modified, read-only, overwrite).
+Only updates for real user buffers, not internal/temporary buffers."
+ ;; Only update cursor for real buffers (not internal ones like *temp*, *Echo Area*, etc.)
+ (unless (string-prefix-p " " (buffer-name)) ; Internal buffers start with space
+ (let* ((state (cond
+ (buffer-read-only 'read-only)
+ (overwrite-mode 'overwrite)
+ ((buffer-modified-p) 'modified)
+ (t 'unmodified)))
+ (color (alist-get state cj/buffer-status-colors)))
+ ;; Only skip if BOTH color AND buffer are the same (optimization)
+ ;; This allows color to update when buffer state changes
+ (unless (and (string= color cj/-cursor-last-color)
+ (string= (buffer-name) cj/-cursor-last-buffer))
+ (set-cursor-color color)
+ (setq cj/-cursor-last-color color
+ cj/-cursor-last-buffer (buffer-name))))))
+
+;; Use post-command-hook to update cursor color after every command
+;; This ensures cursor color always matches the current buffer's state
+(add-hook 'post-command-hook #'cj/set-cursor-color-according-to-mode)
;; Don’t show a cursor in non-selected windows:
(setq cursor-in-non-selected-windows nil)