diff options
Diffstat (limited to 'lisp/+modeline.el')
-rw-r--r-- | lisp/+modeline.el | 110 |
1 files changed, 80 insertions, 30 deletions
diff --git a/lisp/+modeline.el b/lisp/+modeline.el index 5354e5b..5f46a75 100644 --- a/lisp/+modeline.el +++ b/lisp/+modeline.el | |||
@@ -17,22 +17,62 @@ | |||
17 | :prefix "+modeline-" | 17 | :prefix "+modeline-" |
18 | :group 'simple-modeline) | 18 | :group 'simple-modeline) |
19 | 19 | ||
20 | (defun +modeline-buffer-name () ; gonsie | 20 | (defcustom +modeline-default-spacer " " |
21 | "Default spacer to use for modeline elements. | ||
22 | All modeline elements take an optional argument, `spacer', which | ||
23 | will default to this string.") | ||
24 | |||
25 | ;;; Combinators | ||
26 | |||
27 | (defun +modeline-concat (segments &optional separator) | ||
28 | "Concatenate multiple `simple-modeline'-style SEGMENTS. | ||
29 | SEGMENTS is a list of either modeline segment-functions (see | ||
30 | `simple-modeline' functions for an example of types of | ||
31 | functions), though it can also contain cons cells of the | ||
32 | form (SEGMENT . PREDICATE). | ||
33 | |||
34 | Segments are separated from each other using SEPARATOR, which | ||
35 | defaults to a \" \". space. Only segments that evaluate to a | ||
36 | non-trivial string (that is, a string not equal to \"\") will be | ||
37 | separated, for a cleaner look. | ||
38 | |||
39 | This function makes a lambda, so you can throw it straight into | ||
40 | `simple-modeline-segments'." | ||
41 | (setq separator (or separator +modeline-default-spacer)) | ||
42 | (lambda () | ||
43 | (apply #'concat | ||
44 | (let (this-sep result-list) | ||
45 | (dolist (segment segments) | ||
46 | (push (funcall (or (car-safe segment) segment) | ||
47 | this-sep) | ||
48 | result-list) | ||
49 | (if (or (cdr-safe segment) | ||
50 | (and (car result-list) | ||
51 | (not (equal (car result-list) "")))) | ||
52 | (setq this-sep separator) | ||
53 | (setq this-sep nil))) | ||
54 | (unless (seq-some #'null result-list) | ||
55 | (push +modeline-default-spacer result-list)) | ||
56 | (nreverse result-list))))) | ||
57 | |||
58 | ;;; Modeline segments | ||
59 | |||
60 | (defun +modeline-buffer-name (&optional spacer) ; gonsie | ||
21 | "Display the buffer name." | 61 | "Display the buffer name." |
22 | (concat " " (propertize | 62 | (concat (or spacer +modeline-default-spacer) |
23 | (+string-align (buffer-name) 20 :before "" :ellipsis "~ ") | 63 | (propertize |
24 | 'face 'bold | 64 | (+string-align (buffer-name) 20 :ellipsis nil) |
25 | 'help-echo (or (buffer-file-name) | 65 | 'help-echo (or (buffer-file-name) |
26 | (buffer-name)) | 66 | (buffer-name)) |
27 | 'mouse-face 'mode-line-highlight))) | 67 | 'mouse-face 'mode-line-highlight))) |
28 | 68 | ||
29 | (defcustom +modeline-minions-icon "&" | 69 | (defcustom +modeline-minions-icon "&" |
30 | "The \"icon\" for `+modeline-minions' button." | 70 | "The \"icon\" for `+modeline-minions' button." |
31 | :type 'string) | 71 | :type 'string) |
32 | 72 | ||
33 | (defun +modeline-minions () | 73 | (defun +modeline-minions (&optional spacer) |
34 | "Display a button for `minions-minor-modes-menu'." | 74 | "Display a button for `minions-minor-modes-menu'." |
35 | (concat " " | 75 | (concat (or spacer +modeline-default-spacer) |
36 | (propertize | 76 | (propertize |
37 | +modeline-minions-icon | 77 | +modeline-minions-icon |
38 | 'help-echo "Minor modes menu\nmouse-1: show menu." | 78 | 'help-echo "Minor modes menu\nmouse-1: show menu." |
@@ -45,9 +85,9 @@ | |||
45 | (minions-minor-modes-menu))))) | 85 | (minions-minor-modes-menu))))) |
46 | 'mouse-face 'mode-line-highlight))) | 86 | 'mouse-face 'mode-line-highlight))) |
47 | 87 | ||
48 | (defun +modeline-major-mode () | 88 | (defun +modeline-major-mode (&optional spacer) |
49 | "Display the current `major-mode'." | 89 | "Display the current `major-mode'." |
50 | (concat " " | 90 | (concat (or spacer +modeline-default-spacer) |
51 | (propertize (+string-truncate (format-mode-line mode-name) | 91 | (propertize (+string-truncate (format-mode-line mode-name) |
52 | 12 "~") | 92 | 12 "~") |
53 | 'face 'bold | 93 | 'face 'bold |
@@ -80,7 +120,7 @@ The order of elements matters: whichever one matches first is applied." | |||
80 | `+modeline-modified'." | 120 | `+modeline-modified'." |
81 | :type '(repeat function)) | 121 | :type '(repeat function)) |
82 | 122 | ||
83 | (defun +modeline-modified () ; modified from `simple-modeline-status-modified' | 123 | (defun +modeline-modified (&optional spacer) ; modified from `simple-modeline-status-modified' |
84 | "Display a color-coded \"icon\" indicator for the buffer's status." | 124 | "Display a color-coded \"icon\" indicator for the buffer's status." |
85 | (let* ((icon (catch :icon | 125 | (let* ((icon (catch :icon |
86 | (dolist (cell +modeline-modified-icon-alist) | 126 | (dolist (cell +modeline-modified-icon-alist) |
@@ -94,14 +134,20 @@ The order of elements matters: whichever one matches first is applied." | |||
94 | ('t t) | 134 | ('t t) |
95 | (_ nil)) | 135 | (_ nil)) |
96 | (throw :icon (cdr cell))))))) | 136 | (throw :icon (cdr cell))))))) |
97 | (concat " " | 137 | (concat (or spacer +modeline-default-spacer) |
98 | (propertize (or icon "") | 138 | (propertize (or icon "") |
99 | 'mouse-face 'mode-line-highlight)))) | 139 | 'mouse-face 'mode-line-highlight)))) |
100 | 140 | ||
101 | (defun +modeline-narrowed () | 141 | (defun +modeline-buffer-modes (&optional spacer) |
142 | "Display various buffer-specific stuff cleanly." | ||
143 | ;; This is clunky and should probably be improved. | ||
144 | (concat (+modeline-reading-mode) | ||
145 | (+modeline-narrowed (when reading-mode ",")))) | ||
146 | |||
147 | (defun +modeline-narrowed (&optional spacer) | ||
102 | "Display an indication that the buffer is narrowed." | 148 | "Display an indication that the buffer is narrowed." |
103 | (when (buffer-narrowed-p) | 149 | (when (buffer-narrowed-p) |
104 | (concat " " | 150 | (concat (or spacer +modeline-default-spacer) |
105 | (propertize "N" | 151 | (propertize "N" |
106 | 'help-echo (format "%s\n%s" | 152 | 'help-echo (format "%s\n%s" |
107 | "Buffer is narrowed." | 153 | "Buffer is narrowed." |
@@ -111,10 +157,10 @@ The order of elements matters: whichever one matches first is applied." | |||
111 | 'face 'font-lock-doc-face | 157 | 'face 'font-lock-doc-face |
112 | 'mouse-face 'mode-line-highlight)))) | 158 | 'mouse-face 'mode-line-highlight)))) |
113 | 159 | ||
114 | (defun +modeline-reading-mode () | 160 | (defun +modeline-reading-mode (&optional spacer) |
115 | "Display an indication that the buffer is in `reading-mode'." | 161 | "Display an indication that the buffer is in `reading-mode'." |
116 | (when reading-mode | 162 | (when reading-mode |
117 | (concat " " | 163 | (concat (or spacer +modeline-default-spacer) |
118 | (propertize | 164 | (propertize |
119 | (concat "R" (when (bound-and-true-p +eww-readable-p) "w")) | 165 | (concat "R" (when (bound-and-true-p +eww-readable-p) "w")) |
120 | 'help-echo (format "%s\n%s" | 166 | 'help-echo (format "%s\n%s" |
@@ -136,7 +182,7 @@ The order of elements matters: whichever one matches first is applied." | |||
136 | "Toggle the percentage display in the mode line (File Percentage Mode)." | 182 | "Toggle the percentage display in the mode line (File Percentage Mode)." |
137 | :init-value t :global t :group 'mode-line) | 183 | :init-value t :global t :group 'mode-line) |
138 | 184 | ||
139 | (defun +modeline-position () ; adapted from `simple-modeline' | 185 | (defun +modeline-position (&optional _) ; adapted from `simple-modeline' |
140 | "Display the current cursor position." | 186 | "Display the current cursor position." |
141 | (list '((line-number-mode | 187 | (list '((line-number-mode |
142 | ((column-number-mode | 188 | ((column-number-mode |
@@ -160,34 +206,38 @@ The order of elements matters: whichever one matches first is applied." | |||
160 | (region-bounds)))) | 206 | (region-bounds)))) |
161 | 'font-lock-face 'font-lock-variable-name-face)))) | 207 | 'font-lock-face 'font-lock-variable-name-face)))) |
162 | 208 | ||
163 | (defun +modeline-vc () | 209 | (defun +modeline-vc (&optional spacer) |
164 | "Display the version control branch of the current buffer in the modeline." | 210 | "Display the version control branch of the current buffer in the modeline." |
165 | ;; from https://www.gonsie.com/blorg/modeline.html, from Doom | 211 | ;; from https://www.gonsie.com/blorg/modeline.html, from Doom |
166 | (if-let ((backend (vc-backend buffer-file-name))) | 212 | (if-let ((backend (vc-backend buffer-file-name))) |
167 | (concat " " (substring vc-mode (+ (if (eq backend 'Hg) 2 3) 2))))) | 213 | (concat (or spacer +modeline-default-spacer) |
214 | (substring vc-mode (+ (if (eq backend 'Hg) 2 3) 2))))) | ||
168 | 215 | ||
169 | (defun +modeline-track () | 216 | (defun +modeline-track (&optional spacer) |
170 | "Display `tracking-mode' information." | 217 | "Display `tracking-mode' information." |
171 | '(tracking-mode | 218 | (when tracking-mode |
172 | tracking-mode-line-buffers)) | 219 | tracking-mode-line-buffers)) |
173 | 220 | ||
174 | (defun +modeline-anzu () | 221 | (defun +modeline-anzu (&optional spacer) |
175 | "Display `anzu--update-mode-line'." | 222 | "Display `anzu--update-mode-line'." |
176 | (concat " " (anzu--update-mode-line))) | 223 | (concat (or spacer +modeline-default-spacer) |
224 | (anzu--update-mode-line))) | ||
177 | 225 | ||
178 | (defun +modeline-text-scale () | 226 | (defun +modeline-text-scale (&optional spacer) |
179 | "Display text scaling level." | 227 | "Display text scaling level." |
180 | ;; adapted from https://github.com/seagle0128/doom-modeline | 228 | ;; adapted from https://github.com/seagle0128/doom-modeline |
181 | (when (and (boundp 'text-scale-mode-amount) | 229 | (when (and (boundp 'text-scale-mode-amount) |
182 | (/= text-scale-mode-amount 0)) | 230 | (/= text-scale-mode-amount 0)) |
183 | (format (if (> text-scale-mode-amount 0) " (%+d)" " (%-d)") | 231 | (format (if (> text-scale-mode-amount 0) "%s(%+d)" "%s(%-d)") |
232 | (or spacer +modeline-default-spacer) | ||
184 | text-scale-mode-amount))) | 233 | text-scale-mode-amount))) |
185 | 234 | ||
186 | (defun +modeline-ace-window-display () | 235 | (defun +modeline-ace-window-display (&optional spacer) |
187 | "Display `ace-window-display-mode' information in the modeline." | 236 | "Display `ace-window-display-mode' information in the modeline." |
188 | '(+ace-window-display-mode | 237 | (when (and +ace-window-display-mode |
189 | (ace-window-mode | 238 | ace-window-mode) |
190 | (" " (:eval (window-parameter (selected-window) 'ace-window-path)))))) | 239 | (concat (or spacer +modeline-default-spacer) |
240 | (window-parameter (selected-window) 'ace-window-path)))) | ||
191 | 241 | ||
192 | (provide '+modeline) | 242 | (provide '+modeline) |
193 | ;;; +modeline.el ends here | 243 | ;;; +modeline.el ends here |