minmo : git- not vc-

This commit is contained in:
bth 2026-06-03 11:18:31 -07:00
commit 3ea2317e94

View file

@ -81,9 +81,9 @@ filesystem FSTYPE, 'git or 'disk."
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; branch ;;;; branch
(defcustom minmo-branch-prefix ":" "prefix for the branch string.") (defcustom minmo-git-branch-prefix ":" "prefix for the branch string.")
(defvar-local minmo--vc-branch-cache nil (defvar-local minmo--git-branch-cache nil
"Cached mode-line string for git branch.") "Cached mode-line string for git branch.")
(defun minmo--git-branch (file) (defun minmo--git-branch (file)
@ -92,7 +92,7 @@ filesystem FSTYPE, 'git or 'disk."
(branch (with-temp-buffer (branch (with-temp-buffer
(when (eq 0 (call-process "git" nil t nil "branch" "--show-current")) (when (eq 0 (call-process "git" nil t nil "branch" "--show-current"))
(string-trim (buffer-string)))))) (string-trim (buffer-string))))))
(concat minmo-branch-prefix (concat minmo-git-branch-prefix
(if (and branch (not (string-empty-p branch))) branch (if (and branch (not (string-empty-p branch))) branch
;; fallback to short hash when HEAD is detached: ;; fallback to short hash when HEAD is detached:
(with-temp-buffer (with-temp-buffer
@ -100,18 +100,18 @@ filesystem FSTYPE, 'git or 'disk."
(string-trim (buffer-string)) (string-trim (buffer-string))
"?")))))) "?"))))))
(defun minmo-branch () minmo--vc-branch-cache) (defun minmo-git-branch () minmo--git-branch-cache)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; status ;;;; status
(defcustom minmo-status-prefix " " "prefix for the git status string.") (defcustom minmo-git-status-prefix " " "prefix for the git status string.")
(defvar-local minmo--vc-status-cache nil (defvar-local minmo--git-status-cache nil
"Cached mode-line string for git file status.") "Cached mode-line string for git file status.")
(defun minmo-vc-status () (defun minmo-git-status ()
(or minmo--vc-status-cache " ")) (or minmo--git-status-cache " "))
(defvar minmo--git-directory-table (make-hash-table :test 'equal) (defvar minmo--git-directory-table (make-hash-table :test 'equal)
"Store known directories with .git") "Store known directories with .git")
@ -145,7 +145,7 @@ Optional FORCE means ignore the minmo--git-directory-table."
(let* ((status (minmo--git-status-short file)) (let* ((status (minmo--git-status-short file))
(char-index (aref status 0)) (char-index (aref status 0))
(char-work (aref status 1))) (char-work (aref status 1)))
(concat minmo-status-prefix (concat minmo-git-status-prefix
(cond (cond
((string= status " ") (minmo--status 'unmodified 'git)) ((string= status " ") (minmo--status 'unmodified 'git))
((string= status "!!") (minmo--status 'readonly/ignored 'git)) ((string= status "!!") (minmo--status 'readonly/ignored 'git))
@ -155,46 +155,46 @@ Optional FORCE means ignore the minmo--git-directory-table."
((memq char-index '(?M ?A)) (minmo--status 'staged 'git)) ((memq char-index '(?M ?A)) (minmo--status 'staged 'git))
(t (minmo--status 'unmodified 'git)))))) (t (minmo--status 'unmodified 'git))))))
(defun minmo--update-vc-cache (&optional force) (defun minmo--update-git-cache (&optional force)
"Call git and cache the mode-line string." "Call git and cache the mode-line string."
(when (minmo--file-exists-locally-p) (when (minmo--file-exists-locally-p)
(let ((old-status minmo--vc-status-cache) (let ((old-status minmo--git-status-cache)
(old-branch minmo--vc-branch-cache) (old-branch minmo--git-branch-cache)
(git (minmo--find-git buffer-file-name force))) (git (minmo--find-git buffer-file-name force)))
(if git (if git
(progn (progn
(setq minmo--vc-status-cache (minmo--git-status buffer-file-name)) (setq minmo--git-status-cache (minmo--git-status buffer-file-name))
(setq minmo--vc-branch-cache (minmo--git-branch buffer-file-name))) (setq minmo--git-branch-cache (minmo--git-branch buffer-file-name)))
;; NOTE: not in a git repo: clear the caches if something changed: ;; NOTE: not in a git repo: clear the caches if something changed:
(setq minmo--vc-branch-cache nil) (setq minmo--git-branch-cache nil)
(setq minmo--vc-status-cache nil)) (setq minmo--git-status-cache nil))
;; NOTE: redraw only when changed: ;; NOTE: redraw only when changed:
(when (or (not (string= old-status minmo--vc-status-cache)) (when (or (not (string= old-status minmo--git-status-cache))
(not (string= old-branch minmo--vc-branch-cache))) (not (string= old-branch minmo--git-branch-cache)))
(force-mode-line-update))))) (force-mode-line-update)))))
(defun minmo--update-vc-cache-force () (minmo--update-vc-cache t)) (defun minmo--update-git-cache-force () (minmo--update-git-cache t))
;; NOTE: force update minmo--git-directory-table upon open: ;; NOTE: force update minmo--git-directory-table upon open:
(add-hook 'find-file-hook #'minmo--update-vc-cache-force) (add-hook 'find-file-hook #'minmo--update-git-cache-force)
(add-hook 'after-revert-hook #'minmo--update-vc-cache-force) (add-hook 'after-revert-hook #'minmo--update-git-cache-force)
;; but not for a save because this is frequent: ;; but not for a save because this is frequent:
(add-hook 'after-save-hook #'minmo--update-vc-cache) (add-hook 'after-save-hook #'minmo--update-git-cache)
;; NOTE: but normal cache update when window state changes: ;; NOTE: but normal cache update when window state changes:
(defun minmo--update-vc-cache-window-status (frame-or-window) (defun minmo--update-git-cache-window-status (frame-or-window)
(let ((win (if (framep frame-or-window) (let ((win (if (framep frame-or-window)
(frame-selected-window frame-or-window) (frame-selected-window frame-or-window)
frame-or-window))) frame-or-window)))
(with-current-buffer (window-buffer win) (with-current-buffer (window-buffer win)
(minmo--update-vc-cache)))) (minmo--update-git-cache))))
;; NOTE: window-state-change-functions includes size changes, which would be spammy. ;; NOTE: window-state-change-functions includes size changes, which would be spammy.
;; this does selection changes, eg other-window: ;; this does selection changes, eg other-window:
(add-hook 'window-selection-change-functions #'minmo--update-vc-cache-window-status) (add-hook 'window-selection-change-functions #'minmo--update-git-cache-window-status)
;; this does buffer changes, eg switch-to-buffer: ;; this does buffer changes, eg switch-to-buffer:
(add-hook 'window-buffer-change-functions #'minmo--update-vc-cache-window-status) (add-hook 'window-buffer-change-functions #'minmo--update-git-cache-window-status)
;; this is set by vc-hooks.el, which is loaded with `vc' ;; this is set by vc-hooks.el, which is loaded with `vc'
;; TODO: remove? ;; TODO: remove?
@ -208,25 +208,25 @@ Optional FORCE means ignore the minmo--git-directory-table."
;; auto-revert-check-vc-info is t, but restrict to visible windows. Which is ;; auto-revert-check-vc-info is t, but restrict to visible windows. Which is
;; somewhat an obvious optimization. ;; somewhat an obvious optimization.
(defcustom minmo-vc-cache-timer-interval 5 (defcustom minmo-git-cache-timer-interval 5
"interval for `minmo-vc-cache-timer'") "interval for `minmo-git-cache-timer'")
(defvar minmo-vc-cache-timer nil) (defvar minmo-git-cache-timer nil)
(defun minmo--vc-update-cache-visible () (defun minmo--update-git-cache-visible ()
"Update vc cache for visible windows." "Update vc cache for visible windows."
(dolist (win (window-list)) (dolist (win (window-list))
(with-current-buffer (window-buffer win) (with-current-buffer (window-buffer win)
(minmo--update-vc-cache)))) (minmo--update-git-cache))))
;; guard against spawning multiple when this file is eval'd : ;; guard against spawning multiple when this file is eval'd :
(when minmo-vc-cache-timer (cancel-timer minmo-vc-cache-timer)) (when minmo-git-cache-timer (cancel-timer minmo-git-cache-timer))
(setq minmo-vc-cache-timer (setq minmo-git-cache-timer
;; TODO: run-with-idle-timer ? ;; TODO: run-with-idle-timer ?
(run-with-timer (run-with-timer
minmo-vc-cache-timer-interval minmo-git-cache-timer-interval
minmo-vc-cache-timer-interval minmo-git-cache-timer-interval
'minmo--vc-update-cache-visible)) 'minmo--update-git-cache-visible))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; disk ;;;; disk
@ -395,7 +395,7 @@ Optional FORCE means ignore the minmo--git-directory-table."
;;;;;;;;;;;;; ;;;;;;;;;;;;;
;; status ;; status
'(:eval (minmo-vc-status)) '(:eval (minmo-git-status))
'(:eval (minmo-disk-status)) '(:eval (minmo-disk-status))
;;;;;;;;;;;;; ;;;;;;;;;;;;;
@ -404,7 +404,7 @@ Optional FORCE means ignore the minmo--git-directory-table."
;;;;;;;;;;;;; ;;;;;;;;;;;;;
;; branch ;; branch
'(:eval (minmo-branch)) '(:eval (minmo-git-branch))
;;;;;;;;;;;;; ;;;;;;;;;;;;;
;; major-mode ;; major-mode