mode lineを出来るだけ良くしたい
これまで
- mode-lineのモード情報をコンパクトに表示する - syohex’s diaryでごちゃごちゃしたモード情報をきれいにした
- smart-mode-lineを使い始めた - $shibayu36->blog;で、smart-mode-lineを使い始めたけど、あんまりカスタマイズ性が高くなくて断念
- emacsにpowerlineを導入 - $shibayu36->blog;で、powerline.elにしたら使いやすいしカスタマイズ性が高いということが分かった
次の課題
- モードの情報は整ったものの、バッファの情報が分かりにくい
- uniquify:これは便利。同名ファイルのバッファ名の識別文字列を変更する - ヒルズで働く@robarioの技ログにあるようなuniquifyというツールを使うものも、そんなにわかり易くない
- 簡潔にバッファのディレクトリ情報も載せたい
解決案
いろいろ調べていたら、以下のページが参考になった。
powerlineのカスタマイズ
ひとまず https://github.com/milkypostman/powerline/blob/master/powerline-themes.el を参考に、自分用のthemeを作るのが早そうだった。
powerline-default-themeを使ってたので、これをコピーし、powerline-my-themeにし、関数呼び出しをする。
(defun powerline-my-theme () "Setup the my mode-line." (interactive) (setq-default mode-line-format '("%e" (:eval (let* ((active (powerline-selected-window-active)) (mode-line (if active 'mode-line 'mode-line-inactive)) (face1 (if active 'powerline-active1 'powerline-inactive1)) (face2 (if active 'powerline-active2 'powerline-inactive2)) (separator-left (intern (format "powerline-%s-%s" powerline-default-separator (car powerline-default-separator-dir)))) (separator-right (intern (format "powerline-%s-%s" powerline-default-separator (cdr powerline-default-separator-dir)))) (lhs (list (powerline-raw "%*" nil 'l) (powerline-buffer-size nil 'l) (powerline-raw mode-line-mule-info nil 'l) (powerline-buffer-id nil 'l) (when (and (boundp 'which-func-mode) which-func-mode) (powerline-raw which-func-format nil 'l)) (powerline-raw " ") (funcall separator-left mode-line face1) (when (boundp 'erc-modified-channels-object) (powerline-raw erc-modified-channels-object face1 'l)) (powerline-major-mode face1 'l) (powerline-process face1) (powerline-minor-modes face1 'l) (powerline-narrow face1 'l) (powerline-raw " " face1) (funcall separator-left face1 face2) (powerline-vc face2 'r))) (rhs (list (powerline-raw global-mode-string face2 'r) (funcall separator-right face2 face1) (powerline-raw "%4l" face1 'l) (powerline-raw ":" face1 'l) (powerline-raw "%3c" face1 'r) (funcall separator-right face1 mode-line) (powerline-raw " ") (powerline-raw "%6p" nil 'r) (powerline-hud face2 face1)))) (concat (powerline-render lhs) (powerline-fill face2 (powerline-width rhs)) (powerline-render rhs))))))) (powerline-my-theme)
あとはこの中身をいろいろ変えることでカスタマイズ出来る。
ディレクトリの情報を載せる
Amit's Thoughts: Emacs: custom mode lineにかかれている通り、shorten-directoryという関数を定義しておくと便利。これを使って、先ほどのpowerline-my-themeを書き換える。
(defun shorten-directory (dir max-length) "Show up to `max-length' characters of a directory name `dir'." (let ((path (reverse (split-string (abbreviate-file-name dir) "/"))) (output "")) (when (and path (equal "" (car path))) (setq path (cdr path))) (while (and path (< (length output) (- max-length 4))) (setq output (concat (car path) "/" output)) (setq path (cdr path))) (when path (setq output (concat ".../" output))) output)) (defun powerline-my-theme () "Setup the my mode-line." (interactive) (setq-default mode-line-format '("%e" (:eval (let* ((active (powerline-selected-window-active)) (mode-line (if active 'mode-line 'mode-line-inactive)) (face1 (if active 'powerline-active1 'powerline-inactive1)) (face2 (if active 'powerline-active2 'powerline-inactive2)) (separator-left (intern (format "powerline-%s-%s" powerline-default-separator (car powerline-default-separator-dir)))) (separator-right (intern (format "powerline-%s-%s" powerline-default-separator (cdr powerline-default-separator-dir)))) (lhs (list (powerline-raw "%*" nil 'l) (powerline-buffer-size nil 'l) (powerline-raw mode-line-mule-info nil 'l) ;;; !!! ここから書き換えた !!! (powerline-raw (shorten-directory default-directory 15) nil 'l) (powerline-buffer-id nil 'r) ;;; !!! ここまで書き換えた !!! (when (and (boundp 'which-func-mode) which-func-mode) (powerline-raw which-func-format nil 'l)) (powerline-raw " ") (funcall separator-left mode-line face1) (when (boundp 'erc-modified-channels-object) (powerline-raw erc-modified-channels-object face1 'l)) (powerline-major-mode face1 'l) (powerline-process face1) (powerline-minor-modes face1 'l) (powerline-narrow face1 'l) (powerline-raw " " face1) (funcall separator-left face1 face2) (powerline-vc face2 'r))) (rhs (list (powerline-raw global-mode-string face2 'r) (funcall separator-right face2 face1) (powerline-raw "%4l" face1 'l) (powerline-raw ":" face1 'l) (powerline-raw "%3c" face1 'r) (funcall separator-right face1 mode-line) (powerline-raw " ") (powerline-raw "%6p" nil 'r) (powerline-hud face2 face1)))) (concat (powerline-render lhs) (powerline-fill face2 (powerline-width rhs)) (powerline-render rhs)))))))
結果
多少分かりやすくなった。
まとめ
modelineの情報が少し増えた。もっと情報が多いけど、簡潔なmodelineを作っていきたい。