2021-07-28

Emacsでモードライン内の上下に空白を増やす

この間MeiryoKe_ConsoleとInconsolataを合成したフォントを作成してEmacsではそれを使うようにしたのですが、合成したフォントはMeiryoKe_Consoleの寸法がベースになっているのでグリフの上下に余白が少なくモードラインの上下も何だか詰まった感じになってしまいました。

上下が詰まったモードライン
図1: 上下が詰まったモードライン

以前はInconsolataに上下の余裕がたっぷりあったので気にならなかったのですが。

というわけでちょっと余白を増やしてみました。モードラインの内容は mode-line-format 変数で指定できますが、その中ではテキストプロパティを自由に設定できるようになっています。テキストプロパティを設定できると言うことは、そう、おなじみのdisplayプロパティが使えるというわけですね。

今回はモードラインの先頭にdisplayプロパティによって空白を作り出し、その空白の幅、高さ、アセントを設定することで上下の余白をコントロールすることにしました。

;; モードラインの上下内側に空白を設ける。
;; 変数をリスキーだと指定しないとテキストプロパティが反映されないので注意。
(defvar my-mode-line-height
  '((:propertize " " display (space . (:width (1) :height (22) :ascent (16)))))) ;;w=1px, h=20px, ascent=16px
(put 'my-mode-line-height 'risky-local-variable t)

;; mode-line-formatの先頭に'my-mode-line-heightを挿入する。
;; 末尾に挿入すると長いファイル名で右端がフレーム外に出ると空白も消えてしまう。
;; バッファローカル変数なのでsetq-defaultを使う。
(setq-default mode-line-format
              (append (list "" 'my-mode-line-height) ;;先頭は文字列じゃないとダメ
                      mode-line-format))

:height でモードライン全体の高さを指定します。 :ascent でベースラインより上の高さを指定します。 :ascent を増やすと上の余白が増えて下の余白が減ります。

上下に余白を増やしたモードライン
図2: 上下に余白を増やしたモードライン

他にもface(mode-line や mode-line-inactive)の:box属性を使って境界線の幅を増やし色もバックグラウンドと同じにする方法もあるようです。今時のフラットな見た目ならこっちの方が手軽かもしれません。左右に少し空白が空くとは思いますが数ピクセルくらいなら気にならないでしょう。

参考: faces - Padding around modeline text? - Emacs Stack Exchange