I want to customize mode-line-format
using if
or cond
etc., to let it show different text conditionally.
Here is a demo that I tried:
(setq-default
mode-line-format
(quote
(
(:eval
(cond
(buffer-read-only
(propertize " ⚑ "
'face (:foreground "red" :weight 'bold)
'help-echo "buffer is read-only!!!"))
;; (overwrite-mode
;; (propertize "??"))
(buffer-modified-p
(propertize " ☡ "
'face (:foreground "orange")
'help-echo "buffer modified."))
))
(:eval (if (or (eq (buffer-local-value 'major-mode (current-buffer)) 'ruby-mode)
(eq (buffer-local-value 'major-mode (current-buffer)) 'enh-ruby-mode))
(:propertize "Ruby"
face (:foreground "green"))
(:propertize "Not Ruby"
face (:foreground "orange"))))
)))
But it does not show anything, I don't know where is wrong. Need help.
BTW:
I googled this, And got two good results:
- http://amitp.blogspot.com/2011/08/emacs-custom-mode-line.html
- http://emacs-fu.blogspot.com/2011/08/customizing-mode-line.html
And I saw two different code:
(setq-default
mode-line-format
'(
(:propertize var
'face (:foreground "green"))
))
(setq-default
mode-line-format
(list
'(:eval (if ...))
))
I don't know what's the difference.
---------------- UPDATE ---------------------
I found I can't put multiple (propertize ...)
in one (progn ...)
.
Is there any solution to solve this?
(setq-default
mode-line-format
'(
(:eval
(if (memq (buffer-local-value 'major-mode (current-buffer))
'(ruby-mode enh-ruby-mode))
(progn
(propertize " ("
'face '(:foreground "#444444"))
(propertize "Ruby: "
'face '(:family "Segoe Print"
:height 80
:foreground "red2"))
(propertize (rbenv--active-ruby-version) ; `rbenv--modestring'
'face '(:foreground "cyan")
'help-echo '(concat "\nCurrent Ruby version: " (rbenv--active-ruby-version)
"\nmouse-1: switch Ruby version menu")
;; 'local-map
)
(propertize ")"
'face '(:foreground "#444444"))
)
;; (propertize "Not Ruby"
;; 'face '(:foreground "red2"))
))
))
This is solved, use (list (propertize ...) (propertize ...)
.