summaryrefslogtreecommitdiff
path: root/.config/emacs/modules/mm-modeline.el
blob: cd9af3e41385e394b0c3de37a096f745fd3d0135 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
;;; mm-modeline.el --- Pluggable modeline components  -*- lexical-binding: t; -*-

(defmacro mm-modeline--define-component (name &rest forms)
  (declare (indent 1))
  `(progn
     (defvar-local ,name '(:eval (or ,(macroexp-progn forms) "")))
     (put ',name 'risky-local-variable t)))

^L
;;; Faces

(defface mm-modeline-narrow-face
  '((t :foreground "#C5C8C6"		; From ‘mango-theme’
       :background "dark red"
       :box "dark red"
       :weight bold))
  "Face for the `mm-modeline-narrow' modeline component.")

^L
;;; Support Icons

(use-package all-the-icons
  :ensure t
  :init
  (defvar mm-all-the-icons-cookie
    (expand-file-name ".all-the-icons-installed-p" mm-cache-directory))
  (unless (file-exists-p mm-all-the-icons-cookie)
    (all-the-icons-install-fonts)
    (make-empty-file mm-all-the-icons-cookie :parents))
  (set-char-table-range char-width-table #xE907 2))

^L
;;; Modeline Components

(mm-modeline--define-component mm-modeline-readonly
  (when buffer-read-only
    (propertize " READONLY" 'face 'bold)))

(mm-modeline--define-component mm-modeline-buffer-name
  (propertize "%b" 'face 'font-lock-constant-face))

(mm-modeline--define-component mm-modeline-buffer-modified
  (when (and (buffer-modified-p)
	     (buffer-file-name))
    (propertize " (modified)" 'face 'shadow)))

(mm-modeline--define-component mm-modeline-major-mode-name
  (propertize
   (thread-last
     major-mode
     (symbol-name)
     (capitalize)
     (string-replace "-" " ")
     (string-replace "Ts Mode" "Tree-Sitter Mode")
     ;; Casing doesn’t work for abbreviations, so fix it manually
     (replace-regexp-in-string "\\<\\(M\\)?html\\>" "\\1HTML")
     (replace-regexp-in-string "\\<\\(S\\)?css\\>" "\\1CSS")
     (replace-regexp-in-string "\\<toml\\>" "TOML")
     (replace-regexp-in-string "\\<gsp\\>" "GSP"))
   'face 'bold))

(mm-modeline--define-component mm-modeline-major-mode-symbol
  (propertize
   (cond
    ((derived-mode-p 'prog-mode)             "λ ")
    ((derived-mode-p '(text-mode conf-mode)) "§ ")
    ((derived-mode-p 'comint-mode)           ">_ ")
    (t ""))
   'face 'shadow))

(mm-modeline--define-component mm-modeline-narrow
  (when (buffer-narrowed-p)
    (propertize
     " Narrow "
     'face 'mm-modeline-narrow-face)))

(mm-modeline--define-component mm-modeline-git-branch
  (when-let ((branch (car (and (featurep 'vc-git)
                               (vc-git-branches)))))
    (concat
     (propertize "\uE907" 'display '(raise 0))
     " "
     (propertize branch 'face 'font-lock-constant-face)
     " │ ")))

^L
;;; Padding Between Left and Right

(mm-modeline--define-component mm-modeline-left-right-padding
  (let ((length (string-width (format-mode-line mm-modeline-right))))
    (propertize " " 'display `(space :align-to (- right ,length)))))

^L
;;; Configure Modeline

(setopt mode-line-format-right-align 'right-margin)

(setq
 mm-modeline-left (list mm-modeline-narrow
                        mm-modeline-readonly
                        " "
                        mm-modeline-buffer-name
                        mm-modeline-buffer-modified
                        " │ "
                        mm-modeline-major-mode-symbol
                        mm-modeline-major-mode-name
                        mm-modeline-left-right-padding
                        mode-line-end-spaces)
 mm-modeline-right (list mm-modeline-git-branch
                         "%l:%c "))

(setq-default
 mode-line-format
 (list mm-modeline-left mm-modeline-left-right-padding mm-modeline-right))
(provide 'mm-modeline)