Skip to content

Commit 36faa74

Browse files
committed
add src
1 parent bdfb003 commit 36faa74

File tree

1 file changed

+183
-1
lines changed

1 file changed

+183
-1
lines changed

jcs-modeline.el

Lines changed: 183 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
;; Maintainer: Shen, Jen-Chieh <jcs090218@gmail.com>
77
;; URL: https://github.com/jcs-emacs/jcs-modeline
88
;; Version: 0.1.0
9-
;; Package-Requires: ((emacs "27.1"))
9+
;; Package-Requires: ((emacs "27.1") (moody "0.7.1"))
1010
;; Keywords: faces mode-line
1111

1212
;; This file is not part of GNU Emacs.
@@ -31,11 +31,193 @@
3131

3232
;;; Code:
3333

34+
(require 'moody)
35+
3436
(defgroup jcs-modeline nil
3537
"A modeline for jcs-emacs."
3638
:prefix "jcs-modeline-"
3739
:group 'faces
3840
:link '(url-link :tag "Github" "https://github.com/jcs-emacs/jcs-modeline"))
3941

42+
;;
43+
;; (@* "Entry" )
44+
;;
45+
46+
(defvar jcs-modeline--default-mode-line nil
47+
"Default modeline value to revert back.")
48+
49+
(defun jcs-modeline--enable ()
50+
"Enable function `jcs-modeline-mode'."
51+
(setq jcs-modeline--default-mode-line mode-line-format
52+
mode-line-format
53+
'((:eval
54+
(jcs-modeline-render
55+
(quote
56+
("%e "
57+
mode-line-front-space
58+
mode-line-buffer-identification " "
59+
(:eval (moody-tab (concat " " (format-mode-line mode-line-modes))))
60+
" " (:eval (jcs-modeline--vc-project))))
61+
(quote
62+
((:eval
63+
(when (and (bound-and-true-p flycheck-mode)
64+
(or flycheck-current-errors
65+
(eq 'running flycheck-last-status-change)))
66+
(cl-loop for state in '((error . "#FB4933")
67+
(warning . "#FABD2F")
68+
(info . "#83A598"))
69+
as lighter = (jcs-modeline--flycheck-lighter (car state))
70+
when lighter
71+
concat (propertize lighter 'face `(:foreground ,(cdr state))))))
72+
(:eval (jcs-modeline--vc-info)) " "
73+
(:eval (moody-tab " %l : %c " 0 'up)) " %p "
74+
mode-line-end-spaces)))))))
75+
76+
(defun jcs-modeline--disable ()
77+
"Disable function `jcs-modeline-mode'."
78+
(setq mode-line-format jcs-modeline--default-mode-line))
79+
80+
;;;###autoload
81+
(define-minor-mode jcs-modeline-mode
82+
"Minor mode `jcs-modeline-mode'."
83+
:global t
84+
:require 'jcs-modeline-mode
85+
:group 'jcs-modeline
86+
:lighter nil
87+
(if jcs-modeline-mode (jcs-modeline--enable) (jcs-modeline--disable)))
88+
89+
;;
90+
;; (@* "Util" )
91+
;;
92+
93+
(defun jcs-modeline--light-theme-p ()
94+
"Return non-nil if current theme is light theme."
95+
(ignore-errors (jcs-light-color-p (face-background 'default))))
96+
97+
;;
98+
;; (@* "Core" )
99+
;;
100+
101+
(defun jcs-modeline--adjust-pad ()
102+
"Adjust padding for external packages."
103+
(let ((delta 0))
104+
(when vertical-scroll-bar
105+
(when-let* ((data (window-scroll-bars))
106+
(shown (nth 2 data))
107+
(width (nth 1 data)))
108+
(setq delta (+ delta width))))
109+
delta))
110+
111+
(defun jcs-modeline-render (left right)
112+
"Render mode line with LEFT and RIGHT alignment."
113+
(let* ((len-left (length (format-mode-line left)))
114+
(len-right (length (format-mode-line right)))
115+
(available-width (- (window-width) (+ len-left len-right)))
116+
(available-width (+ available-width (jcs-modeline--adjust-pad))))
117+
(append left
118+
(list (format (format "%%%ds" available-width) ""))
119+
right)))
120+
121+
;;
122+
;; (@* "Plugins" )
123+
;;
124+
125+
(defun jcs-modeline--vc-info ()
126+
"Return vc-mode information."
127+
(format-mode-line '(vc-mode vc-mode)))
128+
129+
(defun jcs-modeline--vc-project ()
130+
"Return the project name."
131+
(when-let ((project (jcs-project-root)))
132+
(file-name-nondirectory (directory-file-name project))))
133+
134+
(defun jcs-modeline--flycheck-lighter (state)
135+
"Return flycheck information for the given error type STATE."
136+
(let* ((counts (flycheck-count-errors flycheck-current-errors))
137+
(errorp (flycheck-has-current-errors-p state))
138+
(err (or (cdr (assq state counts)) "?"))
139+
(running (eq 'running flycheck-last-status-change)))
140+
(if (or errorp running) (format "%s" err))))
141+
142+
;;
143+
;; (@* "Themes" )
144+
;;
145+
146+
(defun jcs-modeline--set-color (ac-lst inac-lst)
147+
"Set `mode-line' theme faces with AC-LST and INAC-LST."
148+
(let ((state (frame-focus-state))
149+
(ac-0 (nth 0 ac-lst)) (ac-1 (nth 1 ac-lst))
150+
(ic-0 (nth 0 inac-lst)) (ic-1 (nth 1 inac-lst)))
151+
(set-face-foreground 'mode-line (if state ac-0 ic-0))
152+
(set-face-background 'mode-line (if state ac-1 ic-1))
153+
(set-face-foreground 'mode-line-inactive ic-0)
154+
(set-face-background 'mode-line-inactive ic-1)))
155+
156+
(defun jcs-modeline--set-border-color (color)
157+
"Set the border color with COLOR."
158+
(set-face-foreground 'vertical-border color)
159+
(set-face-foreground 'window-divider color))
160+
161+
(defun jcs-modeline--set-theme (ml-ac-lst ml-inac-lst bc)
162+
"Set the mode line theme.
163+
ML-AC-LST : mode-line active list. ML-INAC-LST : mode-line inactive list.
164+
BC : border color."
165+
(jcs-modeline--set-color ml-ac-lst ml-inac-lst)
166+
(jcs-modeline--set-border-color bc))
167+
168+
(defun jcs-modeline-gray ()
169+
"Gray mode line."
170+
(interactive)
171+
(if (jcs-modeline--light-theme-p)
172+
(jcs-modeline--set-theme
173+
'("#1C1C1C" "#E5E5E5") '("#000000" "#D7D7D7") "#161616")
174+
(jcs-modeline--set-theme
175+
'("#D2D2D2" "#4D4D4D") '("#CCCCCC" "#333333") "#D2D2D2")))
176+
177+
(defun jcs-modeline-dark-green ()
178+
"Dark green mode line."
179+
(interactive)
180+
(if (jcs-modeline--light-theme-p)
181+
(jcs-modeline--set-theme
182+
'("#000" "#B7D3D3") '("#000" "#99C2C2") "#B7D3D3")
183+
(jcs-modeline--set-theme
184+
'("#CCCCCC" "#3C6A69") '("#CCCCCC" "#2B4D4D") "#3C6A69")))
185+
186+
(defun jcs-modeline-dark-blue ()
187+
"Dark blue mode line."
188+
(interactive)
189+
(if (jcs-modeline--light-theme-p)
190+
(jcs-modeline--set-theme
191+
'("#000" "#92B9DF") '("#000" "#7AA0C6") "#92B9DF")
192+
(jcs-modeline--set-theme
193+
'("#CCCCCC" "#205386") '("#CCCCCC" "#0C3765") "#246AAF")))
194+
195+
(defun jcs-modeline-dark-orange ()
196+
"Dark orange mode line."
197+
(interactive)
198+
(if (jcs-modeline--light-theme-p)
199+
(jcs-modeline--set-theme
200+
'("#1C1C1C" "#CC6633") '("#000000" "#682B12") "#CC6633")
201+
(jcs-modeline--set-theme
202+
'("#D2D2D2" "#CC6633") '("#CCCCCC" "#A4532A") "#CC6633")))
203+
204+
(defun jcs-modeline-red ()
205+
"Red mode line."
206+
(interactive)
207+
(if (jcs-modeline--light-theme-p)
208+
(jcs-modeline--set-theme
209+
'("#CCCCCC" "#FF0000") '("#CCCCCC" "#6A0101") "#FF0000")
210+
(jcs-modeline--set-theme
211+
'("#CCCCCC" "#FF0000") '("#CCCCCC" "#6A0101") "#FF0000")))
212+
213+
(defun jcs-modeline-purple ()
214+
"Purple mode line."
215+
(interactive)
216+
(if (jcs-modeline--light-theme-p)
217+
(jcs-modeline--set-theme
218+
'("#CCCCCC" "#B100EB") '("#CCCCCC" "#650286") "#B100EB")
219+
(jcs-modeline--set-theme
220+
'("#CCCCCC" "#B100EB") '("#CCCCCC" "#650286") "#B100EB")))
221+
40222
(provide 'jcs-modeline)
41223
;;; jcs-modeline.el ends here

0 commit comments

Comments
 (0)