やろーじだい

ブログと技術メモです。なにかあればより詳細に書こうということで最初は雑に書くようにしています。質問・要望等あれば Twitter かコメントに下さい。

Emacs: powerline で eyebrows が表示されない問題と一時的な解決方法

powerline を使っている状態で eyebrowse が表示されないので利用できないのかと思っていたがウィンドウ番号がモードラインに表示されていないだけで起動はしていた。

github.com

この issue にあるように修正する。最新の 20180115.1942 バージョンでは 84 行目になっている。

(funcall separator-right face2 face1)
(funcall separator-right face2 mode-line)
(powerline-raw mode-line-misc-info mode-line 'r)
(funcall separator-right mode-line face1)

上を下のように修正・byte-compile した後 Emacs を再起動することで表示できた。今のところこの修正に関するプルリクなどは出ていない。

追記:以下のような add-advice を用いた方法で直接ファイルを編集する必要が無いことがわかったのでこちらの方が良いかもしれない。

emacs.rubikitch.com

このようにすることで powerline 上で powerline-default-theme を呼び出している場合も新しく定義したものを呼び出してくれる。関数が大きくなってしまうのは元の実装の関数が大き過ぎることによる。

(defun powerline-default-theme-for-eyebrowse ()
  "Setup the default mode-line."
  (interactive)
  (setq-default mode-line-format
                '("%e"
                  (:eval
                   (let* ((active (powerline-selected-window-active))
                          (mode-line-buffer-id (if active 'mode-line-buffer-id 'mode-line-buffer-id-inactive))
                          (mode-line (if active 'mode-line 'mode-line-inactive))
                          (face0 (if active 'powerline-active0 'powerline-inactive0))
                          (face1 (if active 'powerline-active1 'powerline-inactive1))
                          (face2 (if active 'powerline-active2 'powerline-inactive2))
                          (separator-left (intern (format "powerline-%s-%s"
                                                          (powerline-current-separator)
                                                          (car powerline-default-separator-dir))))
                          (separator-right (intern (format "powerline-%s-%s"
                                                           (powerline-current-separator)
                                                           (cdr powerline-default-separator-dir))))
                          (lhs (list (powerline-raw "%*" face0 'l)
                                     (when powerline-display-buffer-size
                                       (powerline-buffer-size face0 'l))
                                     (when powerline-display-mule-info
                                       (powerline-raw mode-line-mule-info face0 'l))
                                     (powerline-buffer-id `(mode-line-buffer-id ,face0) 'l)
                                     (when (and (boundp 'which-func-mode) which-func-mode)
                                       (powerline-raw which-func-format face0 'l))
                                     (powerline-raw " " face0)
                                     (funcall separator-left face0 face1)
                                     (when (and (boundp 'erc-track-minor-mode) erc-track-minor-mode)
                                       (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)
                                     (when (bound-and-true-p nyan-mode)
                                       (powerline-raw (list (nyan-create)) face2 'l))))
                          (rhs (list (powerline-raw global-mode-string face2 'r)
                                     (funcall separator-right face2 mode-line)
                                     (powerline-raw mode-line-misc-info mode-line 'r)
                                     (funcall separator-right mode-line face1)
                                     (unless window-system
                                       (powerline-raw (char-to-string #xe0a1) face1 'l))
                                     (powerline-raw "%4l" face1 'l)
                                     (powerline-raw ":" face1 'l)
                                     (powerline-raw "%3c" face1 'r)
                                     (funcall separator-right face1 face0)
                                     (powerline-raw " " face0)
                                     (powerline-raw "%6p" face0 'r)
                                     (when powerline-display-hud
                                       (powerline-hud face0 face2))
                                     (powerline-fill face0 0)
                                     )))
                     (concat (powerline-render lhs)
                             (powerline-fill face2 (powerline-width rhs))
                             (powerline-render rhs)))))))

(use-package powerline
  :defer nil
  :init
  (advice-add 'powerline-default-theme :override 'powerline-default-theme-for-eyebrowse)
  (powerline-default-theme))

github.com

github.com

おまけ

eyebrows で新しいウィンドウを作成するときに現在のバッファーをコピーする挙動を期待することは少ないので eyebrowse-create-window-config した時に *scratch* を開くように advice-addしている。

(advice-add 'eyebrowse-create-window-config
            :after (lambda () (switch-to-buffer "*scratch*")))

追記: それ用の設定があった。こちらを使う方が良い。

github.com

(setq-default eyebrowse-new-workspace t)