Emacsのpowerline.elの不具合を解消する

先日書いたこちらの記事([Emacsでもしゃれた画面でプログラミングがしたい！！](http://qiita.com/itome0403/items/05dc50f6bfbdfb04c0cf))でPowerlineについて触れたので、powerlineの設定で自分がはまったところを紹介したいと思います。

#Vim版powerlineとの違い
EmacsのpowerlineはVimの同名パッケージのEmacs版として作られたものなのですが、Vim版と微妙に違っています。具体的に言うとセパレーターの表現方法が違います。
![emacs170311.png](https://qiita-image-store.s3.amazonaws.com/0/168404/87e01298-2413-f961-f8e5-5c47fc935470.png)

Vim版では使用しているフォントにパッチを当てて、文字の一種としてアローの部分を表現しているようです。一方でEmacs版ではXPMでセパレーターを作っています。powerlineパッケージ内の[powerline-separators.el](https://github.com/milkypostman/powerline/blob/master/powerline-separators.el)というファイルを見てみるとどのようにしているかわかりやすいです。

#Emacs版のpowerlineで困ること
Emacs版ではセパレーターは四角形の画像のようなものなので、背景色も固定されてしまいます。どういうことかというと、セパレーターの三角部分の残り（上の画像でオレンジ三角の上下の紺色の部分）もモードラインの背景色に合わせて明示的に指定してあげなければならないということです。これに対してVim版はセパレーターが文字なので、背景色は勝手に切り替わります。これによって、Emacs版では「複数のウィンドウを表示しているときに、Emacs以外のアプリを開いて、Emacsに戻ってきたとき」という超限定的なタイミングでセパレーターの色がおかしくなります。

#対策方法
アクティブなウィンドウとアクティブでないウィンドウで別な色を指定していると、この不具合が起こるようなので、同じ色を指定しておきましょう。この時、powerlineのセパレーターの背景色にも同じ色を指定すると、きちんと表示できるようになります。

```el:init.el
;;powerlineの設定
(require 'powerline)

(defun powerline-my-theme ()
  "Setup the my mode-line."
  (interactive)
  (setq powerline-current-separator 'utf-8)
  (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 'mode-line-1-fg 'mode-line-2-fg))
                          (face2 (if active 'mode-line-1-arrow 'mode-line-2-arrow))
                          (separator-left (intern (format "powerline-%s-%s"
                                                          (powerline-current-separator)
                                                          (car powerline-default-separator-dir))))
                          (lhs (list (powerline-raw " " face1)
                                     (powerline-major-mode face1)
                                     (powerline-raw " " face1)
                                     (funcall separator-left face1 face2)
                                     (powerline-buffer-id nil )
                                     (powerline-raw " [ ")
                                     (powerline-raw mode-line-mule-info nil)
                                     (powerline-raw "%*" nil)
                                     (powerline-raw " |")
                                     (powerline-process nil)
                                     (powerline-vc)
                                     (powerline-raw " ]")
                                     ))
                          (rhs (list (powerline-raw "%4l" 'l)
                                     (powerline-raw ":" 'l)
                                     (powerline-raw "%2c" 'l)
                                     (powerline-raw " | ")                                  
                                     (powerline-raw "%6p" )
                                     (powerline-raw " ")
                                     )))
                     (concat (powerline-render lhs)
                             (powerline-fill nil (powerline-width rhs)) 
                             (powerline-render rhs)))))))

(defun make/set-face (face-name fg-color bg-color weight)
  (make-face face-name)
  (set-face-attribute face-name nil
                      :foreground fg-color :background bg-color :box nil :weight weight))
(make/set-face 'mode-line-1-fg "#282C34" "#EF8300" 'bold)
(make/set-face 'mode-line-2-fg "#AAAAAA" "#2F343D" 'bold)
(make/set-face 'mode-line-1-arrow  "#AAAAAA" "#3E4451" 'bold) ;;この二行に同じ色を指定
(make/set-face 'mode-line-2-arrow  "#AAAAAA" "#3E4451" 'bold) ;;この二行に同じ色を指定

(powerline-my-theme)
```

#おわりに
最新版のpowerline.elではVimと同様にパッチを当てたフォントに対応しているようなので、できればそちらを使ったほうがいいと思います。自分の環境では何故かうまく行きませんでした。