EmacsWiki: Power Lineの"Evil integration"を見て、日本語入力中か直接入力中か、または頻繁に使うようになった EmacsWiki: smartrep.el*1使用中かに応じてモードラインの一部の色を変えてみようと考えた。
実は以前に powerline.el を用いてモードラインの表示内容に手を加えようとしたことがある。その時には調整がなぜかうまくいかなかったので、次第に powerline.el の利用を避けるようになった。
今回は powerline.el といっても、本家のEmacsWiki: powerline.elでもそのフォーク版のjonathanchu/emacs-powerline · GitHubでもなく、本家の別のフォーク版であるmilkypostman/powerline · GitHubを利用してみた。
表示した実際の変更結果を画像で示そう。モードラインの一番左の部分に注目してほしい。[Aa]と表示されているときは直接入力中を、[あ]と表示されているときは日本語入力中を、
マウスクリックやツールチップ表示に全く対応していないとはいえ、バッファの内容を確認するだけであればそれなりに有用だろう。powerline.el を使って独自にモードラインの体裁を調整するには milkypostman/powerline · GitHub の powerline/powerline-themes.el at master · milkypostman/powerline · GitHub が特に参考になるだろう。powerline-active* (* に数字が入る) の設定方法は powerline/powerline.el at master · milkypostman/powerline · GitHub 中の defface の箇所を参照すればよい。
ソースは以下の通りである。
;; milkypostman/powerline · GitHub ;; https://github.com/milkypostman/powerline (require 'powerline) (defun get-buffer-file-eol-type () (case (coding-system-eol-type buffer-file-coding-system) (0 "LF") (1 "CRLF") (2 "CR") (otherwise "??"))) (defun get-buffer-coding-type-without-eol-type () (labels ((remove-os-info (string) (replace-regexp-in-string "-\\(dos\\|unix\\|mac\\)$" "" string))) (lexical-let ((string (replace-regexp-in-string "-with-signature" "(bom)" (remove-os-info (symbol-name buffer-file-coding-system))))) (if (string-match-p "(bom)" string) (downcase string) (upcase string))))) (defface powerline-active3 '((t (:background "Springgreen4" :inherit mode-line-inactive :foreground "white"))) "Powerline face 3." :group 'powerline) (defface powerline-inactive3 '((t (:background "grey0" :inherit mode-line-inactive))) "Powerline face 3." :group 'powerline) (defface powerline-active4 '((t (:background "VioletRed" :inherit mode-line-inactive :foreground "white"))) "Powerline face 4." :group 'powerline) (defface powerline-inactive4 '((t (:background "grey0" :inherit mode-line-inactive))) "Powerline face 4." :group 'powerline) (defface powerline-active5 '((t (:background "Yellow4" :inherit mode-line-inactive :foreground "white"))) "Powerline face 5." :group 'powerline) (defface powerline-inactive5 '((t (:background "grey0" :inherit mode-line-inactive))) "Powerline face 5." :group 'powerline) (defface powerline-active6 '((t (:background "white" :inherit mode-line-inactive))) "Powerline face 6." :group 'powerline) (defface powerline-inactive6 '((t (:background "grey0" :inherit mode-line-inactive))) "Powerline face 6." :group 'powerline) (defpowerline powerline-ime-mode (cond ((< 0 (length smartrep-mode-line-string)) "<SR>") ((ime-get-mode) "[あ]") (t "[Aa]"))) (defpowerline powerline-coding-type (concat (get-buffer-coding-type-without-eol-type) "[" (get-buffer-file-eol-type) "]")) (defpowerline powerline-buffer-status (concat (if buffer-read-only "r-" "rw") ":" (if (buffer-modified-p) "*" "-"))) (defun powerline-my-theme () "Setup a mode-line with major and minor modes centered." (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)) (face3 (if active 'powerline-active3 'powerline-inactive3)) (face4 (if active 'powerline-active4 'powerline-inactive4)) (face5 (if active 'powerline-active5 'powerline-inactive5)) (face6 (if active 'powerline-active6 'powerline-inactive6)) (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) (cond ((< 0 (length smartrep-mode-line-string)) (powerline-ime-mode face5 'l)) ((ime-get-mode) (powerline-ime-mode face3 'l)) (t (powerline-ime-mode face4 'l))) (cond ((< 0 (length smartrep-mode-line-string)) (funcall separator-left face5 nil)) ((ime-get-mode) (funcall separator-left face3 nil)) (t (funcall separator-left face4 nil))) (powerline-coding-type nil 'l) (powerline-buffer-status nil 'l) ;; (powerline-buffer-size nil 'l) (funcall separator-left face1 face6) (powerline-buffer-id face6 'l) ;; (powerline-raw " ") (funcall separator-left face6 face1) (powerline-major-mode face1 'l) (powerline-narrow face1 'l) (powerline-vc face1))) (rhs (list (powerline-raw global-mode-string face1 'r) (powerline-raw "%4l" face1 'r) (powerline-raw ":" face1) (powerline-raw "%3c" face1 'r) (funcall separator-right nil face5) ;; (powerline-raw " ") (powerline-raw "%6p" face5 'r) (powerline-hud face2 face1))) (center (list (powerline-raw " " face1) (funcall separator-left face1 face2) (when (boundp 'erc-modified-channels-object) (powerline-raw erc-modified-channels-object face2 'l)) (powerline-process face2) ;; (powerline-raw " :" face2) (powerline-minor-modes face2 'l) (powerline-raw " " face2) (funcall separator-right face2 face1)))) (concat (powerline-render lhs) (powerline-fill-center face1 (/ (powerline-width center) 2.0)) (powerline-render center) (powerline-fill face1 (powerline-width rhs)) (powerline-render rhs))))))) (powerline-my-theme)