読者です 読者をやめる 読者になる 読者になる

blechmusikの日記

キー・カスタマイズ・ソフトウェア "DvorakJ" の覚え書きをはじめとして様々なことを書いています。

powerline.el を利用して入力モードに応じた色をモードラインに表示してみた

 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]と表示されているときは直接入力中を、[あ]と表示されているときは日本語入力中を、と表示されているときには smartrep を用いている。

f:id:blechmusik2:20131213020741p:plain
f:id:blechmusik2:20131213020749p:plain
f:id:blechmusik2:20131213020758p:plain

 マウスクリックやツールチップ表示に全く対応していないとはいえ、バッファの内容を確認するだけであればそれなりに有用だろう。powerline.el を使って独自にモードラインの体裁を調整するには milkypostman/powerline · GitHubpowerline/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)