mode-lineのモード情報をコンパクトに表示する

mode-lineに表示されるモードが長ったらしいとうざいです。
最近は PCの画面も横に伸びてきて、1つしかウインドウがない
場合はいいんですが、フレームを分割をしていくと、窮屈に
なってしまいます。


そのあたりのことを何も気にせず設定していると以下のようになって
しまいます。心当たりがある方も多いのではないでしょうか。



外部から変えられてたり、autocompleteみたいに簡潔につけているものも
あるんですが、すべてそういうわけではありませんので、結局長いのが
残ってしまっていたっていう現状だったんですが、対応方法がわかった
ので示します。

対応方法

Hiding and replacing modeline strings with clean-mode-line - Mastering Emacs


に書いているままなんですが、after-change-major-mode-hookを
使って mode-name変数を変更することで実現できます。


私は以下のように設定しています。

(defvar mode-line-cleaner-alist
  '( ;; For minor-mode, first char is 'space'
    (yas-minor-mode . " Ys")
    (paredit-mode . " Pe")
    (eldoc-mode . "")
    (abbrev-mode . "")
    (undo-tree-mode . " Ut")
    (elisp-slime-nav-mode . " EN")
    (helm-gtags-mode . " HG")
    (flymake-mode . " Fm")
    ;; Major modes
    (lisp-interaction-mode . "Li")
    (python-mode . "Py")
    (ruby-mode   . "Rb")
    (emacs-lisp-mode . "El")
    (markdown-mode . "Md")))

(defun clean-mode-line ()
  (interactive)
  (loop for (mode . mode-str) in mode-line-cleaner-alist
        do
        (let ((old-mode-str (cdr (assq mode minor-mode-alist))))
          (when old-mode-str
            (setcar old-mode-str mode-str))
          ;; major mode
          (when (eq mode major-mode)
            (setq mode-name mode-str)))))

(add-hook 'after-change-major-mode-hook 'clean-mode-line)


これで以下のようになりました。


多くの場合 minor-modeを設定しているのは自分自身なので、
何が有効なんて知ってるわ、ってことが多いと思うので、
2文字ぐらいの情報で十分なのではないかと思います。
あと which-funcはデフォルトだと、その右に表示されるので、
minor-modeが長くなりすぎて、which-funcが切れてしまうという
状況も少なくなるのではないでしょうか。


別にコンパクトにしなくても、好きなものが設定できるので、
いろいろ遊べます。以下にネタっぽいものを 2つ示します。
オリジナルのものを追求してみてはいかがでしょうか ?

応用1

(defvar mode-line-cleaner-alist
  `( ;; For minor-mode, first char is 'space'
    (yas-minor-mode . ,(propertize " ●" 'face '(((:bold t :foreground "yellow")))))
    (paredit-mode . ,(propertize " ●" 'face '(((:bold t :foreground "red")))))
    (undo-tree-mode . ,(propertize " ●" 'face '(((:bold t :foreground "RoyalBlue1")))))
    (elisp-slime-nav-mode . ,(propertize " ●" 'face '(((:bold t :foreground "blue")))))
    (auto-complete-mode . ,(propertize " ●" 'face '(((:bold t :foreground "orange")))))
    ;; Major modes
    (emacs-lisp-mode . ,(propertize "●" 'face '(((:bold t :foreground "chartreuse")))))))


応用 2

(defvar mode-line-cleaner-alist
  `( ;; For minor-mode, first char is 'space'
    (yas-minor-mode . ,(propertize "  " 'face '(((:background "yellow")))))
    (paredit-mode . ,(propertize "  " 'face '(((:background "red")))))
    (undo-tree-mode . ,(propertize "  " 'face '(((:background "RoyalBlue1")))))
    (elisp-slime-nav-mode . ,(propertize "  " 'face '(((:background "blue")))))
    (auto-complete-mode . ,(propertize "  " 'face '(((:background "orange")))))
    ;; Major modes
    (emacs-lisp-mode . ,(propertize "  " 'face '(((:background "chartreuse")))))))