summaryrefslogtreecommitdiff
path: root/breadcrumb.el
diff options
context:
space:
mode:
authorJoão Távora <joaotavora@gmail.com>2026-05-03 11:16:08 +0100
committerJoão Távora <joaotavora@gmail.com>2026-05-03 11:16:08 +0100
commit04c50e32e8f32afd68242e4dc28da02e8a45e237 (patch)
treeff953e4cf7a5d338b6c4225e17c5ebcdfaeffdcc /breadcrumb.el
parent495b5117521beb6192b95da959c36007bca5b6cb (diff)
Per #27: Add opinionated mode-line entry pointsexternals/breadcrumb
* breadcrumb.el (breadcrumb-opinionated-mlf): New defcustom. (breadcrumb-opinionated-diminished-modes): New defcustom. (bc--saved-mlf, bc--saved-lighters): New variables. (bc--diminish): New function. (breadcrumb-opinionated-mode): New global minor mode. * README.md: Fix "is a global mode" grammar. Add "An opinionated mode line" section.
Diffstat (limited to 'breadcrumb.el')
-rw-r--r--breadcrumb.el71
1 files changed, 71 insertions, 0 deletions
diff --git a/breadcrumb.el b/breadcrumb.el
index efde47f..f14e1a2 100644
--- a/breadcrumb.el
+++ b/breadcrumb.el
@@ -451,6 +451,77 @@ propertized crumbs."
(push-mark)
(bc--goto (selected-window) choice))))
+
+;;;; Opinionated mode line
+;;
+
+;;;###autoload
+(defcustom breadcrumb-opinionated-mlf
+ '("%e"
+ mode-line-modified
+ (:eval (bc-project-crumbs))
+ " "
+ (:propertize " " face default)
+ " "
+ (:eval (bc-imenu-crumbs))
+ " "
+ mode-line-format-right-align
+ (vc-mode vc-mode)
+ " "
+ mode-line-modes
+ mode-line-misc-info
+ " %p%  %l:%c"
+ (:eval (format-time-string "  %H:%M")))
+ "A `mode-line-format' with breadcrumb project and imenu crumbs.
+Replaces `mode-line-buffer-identification' with the output of
+`breadcrumb-project-crumbs' and `breadcrumb-imenu-crumbs'."
+ :type '(repeat sexp))
+
+(defcustom bc-opinionated-diminished-modes
+ '(yas-minor-mode eldoc-mode company-mode whitespace-mode
+ which-key-mode)
+ "Minor modes whose lighters are hidden by `breadcrumb-opinionated-mode'."
+ :type '(repeat symbol))
+
+(defvar bc--saved-mlf)
+(defvar bc--saved-lighters nil)
+
+(defun bc--diminish (mode)
+ (when-let* ((cell (assq mode minor-mode-alist)))
+ (push (cons mode (cadr cell)) bc--saved-lighters)
+ (setcar (cdr cell) "")))
+
+;;;###autoload
+(define-minor-mode breadcrumb-opinionated-mode
+ "Global minor mode installing an opinionated breadcrumb mode line.
+On activation, saves the current `mode-line-format' default and replaces
+it with `breadcrumb-opinionated-mlf'."
+ :global t
+ (cond
+ (bc-opinionated-mode
+ (unless (boundp 'bc--saved-mlf) (setq bc--saved-mlf (default-value 'mode-line-format)))
+ (setq-default mode-line-format bc-opinionated-mlf)
+ (mapc #'bc--diminish bc-opinionated-diminished-modes)
+ (advice-add 'add-minor-mode :after
+ (lambda (toggle &rest _)
+ (when (memq toggle bc-opinionated-diminished-modes)
+ (bc--diminish toggle)))
+ '((name . bc--do-diminish-advice))))
+ (t
+ (setq-default mode-line-format bc--saved-mlf)
+ (advice-remove 'add-minor-mode 'bc--do-diminish-advice)
+ (dolist (saved bc--saved-lighters)
+ (when-let* ((cell (assq (car saved) minor-mode-alist)))
+ (setcar (cdr cell) (cdr saved))))
+ (setq bc--saved-lighters nil)
+ (makunbound 'bc--saved-mlf))))
+
+(advice-add 'mode--line-format-right-align :filter-return
+ (lambda (r)
+ (when bc-opinionated-mode
+ (propertize r 'face 'default)))
+ '((name . bc-opinionated-mlf)))
+
(provide 'breadcrumb)
;;;###autoload (register-definition-prefixes "breadcrumb" '("breadcrumb-"))