🏛️

【Emacs入門】③モードラインについて考える(Moody / Minions)

2021/08/03に公開

Emacsにはモードラインというものがあります。下の画像の赤枠で囲われたところがモードラインです。

モードラインには、文字コード、バッファ名、カーソル位置、バージョンコントロール、メジャーモードやマイナーモードなど、たくさんの情報が表示されています。

私はモードライン用のパッケージとしてMoodyとMinionsを使っていますが、デフォルトだと下の画像のような見た目になります。

デフォルトのままだと少し味気ないし見づらいところ(マイナーモードなど)もありますね。

モードライン用のパッケージ

モードライン用のパッケージとしてどのようなものがあるのか調べてみました。他にもあると思いますがざっとこんな感じです。

  1. Powerline
    https://github.com/milkypostman/powerline
    VimのPowerlineをEmacsへ移植したものです。
  2. Telephone Line
    https://github.com/dbordak/telephone-line
    1のPowerlineの再実装です。強化版といったところですかね。
  3. Spaceline
    https://github.com/TheBB/spaceline
    Spacemacsで使われているモードラインです。
  4. doom-modeline
    https://github.com/seagle0128/doom-modeline
    Doom Emacsで使われているモードラインです。
  5. nano-modeline
    https://github.com/rougier/nano-emacs/blob/master/nano-modeline.el
    GNU Emacs / N Λ N Oで使われているモードラインです。
  6. Moody
    https://github.com/tarsius/moody
    Magit(EmacsのGit用パッケージ)の開発者として有名なJonas Bernoulliさん(@tarsius)によるモードライン用パッケージです。

現在流行っているのはdoom-modelineでしょうか。これは一度試してみましたがお手軽にVS Codeのような見た目になりますね。

doom-modelineの使い勝手や見た目は決して悪くないのですが、結局のところdoom-themesを使っていないということもあって見合わせました。Emacsの見た目をモダンエディタに近づけていくことにいささか抵抗があるという個人的な思いもあります。文字コードやファイルの変更有無などをまとめて表す U:--- の表記は、結構毛嫌いする人も見受けられますが私は好きです。

nano-modelineが組み込まれているGNU Emacs / N Λ N Oについては、つい先日ladicleさんのツイートで初めてその存在を知りました。

https://twitter.com/Ladicle/status/1416708358569005063

シンプルで良さそうですね。ダークテーマには北欧調で有名なテーマ「Nord」が使われているみたいです。

ちなみにladicleさんの記事やEmacsの設定は入門当初からずっと参考にしています。学びが多くてとても助かりますね。

このように個性の異なるモードラインのパッケージがいくつかありますので好みのものを探してみてください。私が採用したのは先ほども述べましたがMagit開発者のJonas BernoulliさんによるMoodyです。前回の記事で紹介したModus Themesでもサポートされているパッケージです。マイナーモードの見づらさ対策は、これもまたJonas BernoulliさんによるMinionsで解決しました。ここでは主にMoodyとMinionsについて解説していきたいと思います。

インストール

前回の記事と同じようにインストールしてみたいと思います。

M-x list-packages を実行後、パッケージ一覧からMoodyとMinionsを探します。それぞれのパッケージにカーソルを合わせてiキー/xキーを続けて押下しインストールを実行します。

設定

Moody

公式ドキュメントの設定例がuse-packageを使った記述になっているので、ここではuse-packageを使わないベーシックな設定例を挙げることにします。

init.el
(require 'moody)
(setq x-underline-at-descent-line t)
(moody-replace-mode-line-buffer-identification)
(moody-replace-vc-mode)

(require 'moody) は設定方法によっては省略できるのですが、ここでは敢えて記述します。詳細はまた別の機会でお話します。

macOSの場合の注意点

macOSでMoodyを使うと以下のような見た目になってしまいます。

バッファ名両端のセパレータの色が残念な感じです。

これを解決するには以下のようにします。

init.el
(require 'moody)
(setq x-underline-at-descent-line t)
(moody-replace-mode-line-buffer-identification)
(moody-replace-vc-mode)
;; 以下を追加
(when (eq system-type 'darwin)
  (setq moody-slant-function 'moody-slant-apple-rgb))

(when (eq system-type 'darwin) ...) は、OSがmacOSの場合のみ評価したい式があるときに使います。darwin とはmacOSが動作するカーネルのことですね。

Minions

Minionsとは、モードライン上のマイナーモードの表示をイイ感じにしてくれるパッケージです。

モードライン上に表示されるマイナーモードの数が増えてくると、モードラインを占有してとても見づらくなってしまいます(赤枠)。

Minionsを使うと以下のようになります。

モードライン上の ;- をクリックすると以下のようにマイナーモードのリストが表示されます。

M-x minions-minor-modes-menu でもリストを表示することができます。

私は ;- の表示が好みではなかったので [+] に変更しました。

init.elには以下のように記述します。

init.el
(require 'minions)
(minions-mode)
(setq minions-mode-line-lighter "[+]")

こちらの (require 'minions) についてもMoody同様設定によって省略できます。

列番号を表示する

モードラインのデフォルトの設定では、行番号は表示されているのですが列番号が表示されていません。

init.elに以下を記述しておくと列番号が表示されるようになります。

init.el
(column-number-mode)

応用編

以下は必須の設定ではないため必要なければ読まなくも大丈夫です。興味があれば参考にしてみてください。

VC Modeの表示を変更する

GitやSVNといったバージョン管理システムを使用している場合、その管理下にあるファイルからバッファを開くとモードラインにはブランチ名が表示されます。デフォルトでは、Gitのmasterブランチであれば Git-master とか Git:master と表示されます。この違いはファイルが前回のコミットから変更されていないかされているかです。前回投稿記事のModus Themesを使用している場合、その違いによってブランチ名の色が変わります。変更されていない場合は薄めの青色、変更されている場合は黄土色になります。色で識別できるのであれば Git-Git: の表示は不要なので、ここではそれらをとっぱらおうと思います。

以下をinit.elに記述してください。

init.el
(advice-add 'vc-git-mode-line-string
            :filter-return
            (lambda (arg) (substring arg 4)))

SVNについては使ったことがないので取り上げることができません。申し訳ありません。

アクティブウィンドウのバッファ名の色を変更する

アクティブウィンドウのバッファ名のみ、Modus Themesの中で定義されている青色で表示されるようにして、アクティブウィンドウのバッファ名であることを識別しやすくしてみます。

以下をinit.elに記述してください。一つだけ注意点があって、Modus Themesの設定箇所より後に記述してください。

init.el
(defvar my/active-window nil)

(add-hook 'post-command-hook (lambda ()
                               (setq my/active-window (selected-window))))
(add-hook 'buffer-list-update-hook
          (lambda ()
            (setq mode-line-buffer-identification
                  '(:eval (propertized-buffer-identification "%12b")))
            (force-mode-line-update)))

(make-face 'my/mode-line-buffer-id-active)
(set-face-attribute 'my/mode-line-buffer-id-active nil
                    :inherit 'mode-line-buffer-id
                    :foreground (cdr (assoc 'blue modus-themes-vivendi-colors)))

(advice-add 'propertized-buffer-identification
            :filter-return
            (lambda (arg)
              (if (eq my/active-window (selected-window))
                  (put-text-property 0 (length (car arg))
                                     'face 'my/mode-line-buffer-id-active
                                     (car arg)))
              arg))

advice-addput-text-property については、それぞれ別の機会で詳しく取り上げる予定です。その際に設定例として再度上記のコードを扱います。今はコピペでOKです。

Discussion