forked from tautologyclub/feebleline
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfeebleline-test.el
177 lines (147 loc) · 6.07 KB
/
feebleline-test.el
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
;;; Code:
(defcustom feebleline-msg-functions nil
"Fixme -- document me.")
(defcustom feebleline-timer-interval 0.1
"Refresh interval of feebleline mode-line proxy."
:group 'feebleline)
(defcustom feebleline-use-legacy-settings nil
"Hacky settings only applicable to releases older than 25."
:group 'feebleline
)
(defvar feebleline--home-dir nil)
(defvar feebleline--msg-timer)
(defvar feebleline/mode-line-format-previous)
(defface feebleline-git-branch-face '((t :foreground "#444444" :italic t))
"Example face for git branch."
:group 'feebleline)
(defun feebleline-linecol-string ()
"Hey guy!"
(format "%4s:%-2s" (format-mode-line "%l") (current-column)))
(defun feebleline-previous-buffer-name ()
"Get name of previous buffer."
(buffer-name (other-buffer (current-buffer) 1)))
(defun feebleline-line-number ()
"Line number as string."
(if (buffer-file-name)
(format "%s" (line-number-at-pos))))
(defun feebleline-column-number ()
"Column number as string."
(if (buffer-file-name)
(format "%s" (current-column))))
(defun feebleline-file-directory ()
"Current directory, if buffer is displaying a file."
(if (buffer-file-name)
(replace-regexp-in-string
(concat "^" feebleline--home-dir) "~"
default-directory)
""))
(defun feebleline-file-or-buffer-name ()
"Current file, or just buffer name if not a file."
(if (buffer-file-name)
(file-name-nondirectory (buffer-file-name))
(buffer-name)))
(defun feebleline-file-modified-star ()
"Display star if buffer file was modified."
(when (and (buffer-file-name) (buffer-modified-p)) "*"))
(defun feebleline-project-name ()
"Return projectile project name if exists, otherwise nil."
(unless (string-equal "-" (projectile-project-name))
(projectile-project-name)))
;; -- TODO:
;; right-align property doesn't work with post/pre and it also messes up other
;; frames that don't have the same font size. Furthermore it has to be the last
;; element of the list and no more than one element can have the property.
;; Shortly, it's shite.
(setq
feebleline-msg-functions
'((feebleline-line-number ((post . "") (fmt . "%5s")))
(feebleline-column-number ((pre . ":") (fmt . "%-2s")))
(feebleline-file-directory ((face . feebleline-dir-face) (post . "")))
(feebleline-file-or-buffer-name ((face . font-lock-keyword-face) (post . "")))
(feebleline-file-modified-star ((face . font-lock-warning-face) (post . "")))
(magit-get-current-branch ((face . feebleline-git-branch-face) (pre . " - ")))
;; (feebleline-project-name ((right-align . t)))
))
(defmacro feebleline-append-msg-function (&rest b)
"Macro for adding B to the feebleline mode-line, at the end."
`(add-to-list 'feebleline-msg-functions ,@b t (lambda (x y) nil)))
(defmacro feebleline-prepend-msg-function (&rest b)
"Macro for adding B to the feebleline mode-line, at the beginning."
`(add-to-list 'feebleline-msg-functions ,@b nil (lambda (x y) nil)))
;; (feebleline-append-msg-function '((lambda () "end") ((pre . "/"))))
;; (feebleline-append-msg-function '(magit-get-current-branch ((pre . "/"))))
;; (feebleline-prepend-msg-function '((lambda () "-") ((post . "/"))))
(defun feebleline-default-settings-on ()
"Some default settings that works well with feebleline."
(setq window-divider-default-bottom-width 1
window-divider-default-places (quote bottom-only))
(window-divider-mode t)
(setq-default mode-line-format nil)
(setq mode-line-format nil))
(defun feebleline-legacy-settings-on ()
"Some default settings for EMACS < 25."
(set-face-attribute 'mode-line nil :height 0.1))
(defun feebleline--insert ()
"Insert stuff into the mini buffer."
(unless (current-message)
(let ((tmp-string ""))
(dolist (idx feebleline-msg-functions)
(let ((string-func (car idx))
(props (cadr idx)))
(let ((msg (apply string-func nil))
(string-face (cdr (assoc 'face props)))
(pre (cdr (assoc 'pre props)))
(post (cdr (assoc 'post props)))
(fmt (cdr (assoc 'fmt props)))
(right-align (cdr (assoc 'right-align props)))
)
(when msg
(unless string-face (setq string-face 'feebleline-default-face))
(unless post (setq post " "))
(unless fmt (setq fmt "%s"))
(when right-align
(setq fmt
(concat "%"
(format "%s" (- (window-width) (length tmp-string) 1))
"s"))
;; (message "%s" fmt)
)
(setq tmp-string
(concat
tmp-string
(propertize
(concat pre (format fmt msg) post)
'face string-face)))))))
(with-current-buffer " *Minibuf-0*"
(erase-buffer)
(insert tmp-string)))))
(defun feebleline--clear-echo-area ()
"Erase echo area."
(with-current-buffer " *Minibuf-0*"
(erase-buffer))
)
;;;###autoload
(define-minor-mode feebleline-mode
"Replace modeline with a slimmer proxy."
:require 'feebleline
:global t
(if feebleline-mode
;; Activation:
(progn
(setq feebleline--home-dir (expand-file-name "~"))
(setq feebleline/mode-line-format-previous mode-line-format)
(setq feebleline--msg-timer (run-with-timer 0 feebleline-timer-interval 'feebleline--insert))
(if feebleline-use-legacy-settings (feebleline-legacy-settings-on)
(feebleline-default-settings-on))
(add-hook 'focus-in-hook 'feebleline-mode-line-proxy-fn)
)
;; Deactivation:
(set-face-attribute 'mode-line nil :height 1.0)
(setq-default mode-line-format feebleline/mode-line-format-previous)
(setq mode-line-format feebleline/mode-line-format-previous)
(cancel-timer feebleline--msg-timer)
(remove-hook 'focus-in-hook 'feebleline-mode-line-proxy-fn)
(force-mode-line-update)
(redraw-display)
(feebleline--clear-echo-area)))
;