Posted at

Emacsの行番号表示にモヤモヤした話


linumからdisplay-line-numbersへ移行

これまでEmacsで行番号を表示するといったらlinumが一般的だったが、ver.26からはdisplay-line-numbers-modeが使えるようになったらしい1。linumよりも速いとか。早速導入してみる。

;; display line numbers

(if (version<= "26.0.50" emacs-version)
(progn
(global-display-line-numbers-mode)
;; テーマはdeeper-blueを使用している。これに合わせた色を選んだつもり
(set-face-attribute 'line-number nil
:foreground "DarkOliveGreen"
:background "#131521")
(set-face-attribute 'line-number-current-line nil
:foreground "gold")))


最終行どうなってるのか分からん問題

で、見た目はこんな感じになる。



まあ悪くないのだが、最終行(画像でいうと5行目)に改行があるのかないのか、見分けがつかないのが気になる2。すなわち、空行があってもなくても同じ表示であり、カーソルを終端まで移動させないと空行の有無がわからない。フォーマットによっては最終行を空行にすることが推奨されているので(例えばYAML)、見ただけでわかるようにしたい3。他のエディタ(例えばPyCharm)では、空行にも行番号が振られているので分かりやすい。


妥協案

いろいろ調べてみたものの、満足なソリューションが見つからなかった。バッファの最後に[EOB]のような記号を表示させるとか、whitespace-modeで行末を表示させる、といった方法はありそうだが、やりたいことに対して手間をかけすぎている気がする。現状採用しているのは次の設定。

(setq-default indicate-empty-lines t)

(setq-default indicate-buffer-boundaries 'left)

フランジ(フレームの左端にある領域をこう呼ぶらしい)に空行やバッファの終端を表示できる。次のように表示される:



これは5行目に改行があるとき。



こちらはないとき。カギカッコのようなマークが点線(空行を表す)と繋がっていないので異常と気が付きやすい。





  1. 参考:emacs 26で入ったdisplay-line-numbersを利用する 



  2. display-line-numbers-modeだけの話ではなく、linumでも同様である。Emacsの基礎的な部分に関わることで簡単には修正できないのかも。 



  3. 保存時に警告させるとか、別なソリューションがあることに執筆時点で気がついた。