Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

先日書いたこちらの記事(Emacsでもしゃれた画面でプログラミングがしたい!!)でPowerlineについて触れたので、powerlineの設定で自分がはまったところを紹介したいと思います。

Vim版powerlineとの違い

EmacsのpowerlineはVimの同名パッケージのEmacs版として作られたものなのですが、Vim版と微妙に違っています。具体的に言うとセパレーターの表現方法が違います。
emacs170311.png

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

Emacs版のpowerlineで困ること

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

対策方法

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

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と同様にパッチを当てたフォントに対応しているようなので、できればそちらを使ったほうがいいと思います。自分の環境では何故かうまく行きませんでした。

itome
cyberagent
サイバーエージェントは「21世紀を代表する会社を創る」をビジョンに掲げ、インターネットテレビ局「AbemaTV」の運営や国内トップシェアを誇るインターネット広告事業を展開しています。インターネット産業の変化に合わせ新規事業を生み出しながら事業拡大を続けています。
http://www.cyberagent.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away