Emacsのモードラインにページの総行数をきれいに表示する方法

以前の記事でも書いたけれどモードラインに総行数を表示している。だから実はglobal-linum-modeは表示していない。



CとかLとかはすっぱぬいた。また、なるべくデザインというかもともとの表示スタイルを壊さずにした結果が以下のようになった。

;; モードラインに行番号表示
(line-number-mode t)
;; モードラインに列番号表示
(column-number-mode t)
;; モードラインにファイルサイズ表示
;;(size-indication-mode -1)

;; モードラインの割合表示を総行数表示
(defvar my-lines-page-mode t)
(defvar my-mode-line-format)

(when my-lines-page-mode
  (setq my-mode-line-format "%d")
  (if size-indication-mode
      (setq my-mode-line-format (concat my-mode-line-format " of %%I")))
  (cond ((and (eq line-number-mode t) (eq column-number-mode t))
         (setq my-mode-line-format (concat my-mode-line-format " (%%l,%%c)")))
        ((eq line-number-mode t)
         (setq my-mode-line-format (concat my-mode-line-format " L%%l")))
        ((eq column-number-mode t)
         (setq my-mode-line-format (concat my-mode-line-format " C%%c"))))

  (setq mode-line-position
        '(:eval (format my-mode-line-format
                        (count-lines (point-max) (point-min))))))

イデアのかけらもないがこうなった。モードラインのこの部分をいじるにはmode-line-positionという変数をいじる必要がある。mode-line-positionはデフォルトでどうなっているかというと、

((-3 #("%p" 0 2 (help-echo "Size indication mode
mouse-1: Display Line and Column Mode Menu" mouse-face mode-line-highlight local-map (keymap (mode-line keymap (down-mouse-1 keymap (column-number-mode menu-item "Display Column Numbers" column-number-mode :help "Toggle displaying column numbers in the mode-line" :button (:toggle . column-number-mode)) (line-number-mode menu-item "Display Line Numbers" line-number-mode :help "Toggle displaying line numbers in the mode-line" :button (:toggle . line-number-mode)) "Toggle Line and Column Number Display")))))) (size-indication-mode (8 #(" of %I" 0 6 (help-echo "Size indication mode
mouse-1: Display Line and Column Mode Menu" mouse-face mode-line-highlight local-map (keymap (mode-line keymap (down-mouse-1 keymap (column-number-mode menu-item "Display Column Numbers" column-number-mode :help "Toggle displaying column numbers in the mode-line" :button (:toggle . column-number-mode)) (line-number-mode menu-item "Display Line Numbers" line-number-mode :help "Toggle displaying line numbers in the mode-line" :button (:toggle . line-number-mode)) "Toggle Line and Column Number Display"))))))) (line-number-mode ((column-number-mode (10 #(" (%l,%c)" 0 8 (help-echo "Line number and Column number
mouse-1: Display Line and Column Mode Menu" mouse-face mode-line-highlight local-map (keymap (mode-line keymap (down-mouse-1 keymap (column-number-mode menu-item "Display Column Numbers" column-number-mode :help "Toggle displaying column numbers in the mode-line" :button (:toggle . column-number-mode)) (line-number-mode menu-item "Display Line Numbers" line-number-mode :help "Toggle displaying line numbers in the mode-line" :button (:toggle . line-number-mode)) "Toggle Line and Column Number Display")))))) (6 #(" L%l" 0 4 (help-echo "Line Number
mouse-1: Display Line and Column Mode Menu" mouse-face mode-line-highlight local-map (keymap (mode-line keymap (down-mouse-1 keymap (column-number-mode menu-item "Display Column Numbers" column-number-mode :help "Toggle displaying column numbers in the mode-line" :button (:toggle . column-number-mode)) (line-number-mode menu-item "Display Line Numbers" line-number-mode :help "Toggle displaying line numbers in the mode-line" :button (:toggle . line-number-mode)) "Toggle Line and Column Number Display")))))))) ((column-number-mode (5 #(" C%c" 0 4 (help-echo "Column number
mouse-1: Display Line and Column Mode Menu" mouse-face mode-line-highlight local-map (keymap (mode-line keymap (down-mouse-1 keymap (column-number-mode menu-item "Display Column Numbers" column-number-mode :help "Toggle displaying column numbers in the mode-line" :button (:toggle . column-number-mode)) (line-number-mode menu-item "Display Line Numbers" line-number-mode :help "Toggle displaying line numbers in the mode-line" :button (:toggle . line-number-mode)) "Toggle Line and Column Number Display"))))))))))

モードライン上でのマウス操作に関する設定みたいなものが多くを占めているのであって見た目ほど複雑ではない。ちょっと見づらいから整形。

((-3 #("%p" 0 2 (help-echo "Size indication mode
mouse-1: Display Line and Column Mode Menu" mouse-face mode-line-highlight local-map (keymap (mode-line keymap (down-mouse-1 keymap (column-number-mode menu-item "Display Column Numbers" column-number-mode :help "Toggle displaying column numbers in the mode-line" :button (:toggle . column-number-mode)) (line-number-mode menu-item "Display Line Numbers" line-number-mode :help "Toggle displaying line numbers in the mode-line" :button (:toggle . line-number-mode)) "Toggle Line and Column Number Display")))))) 

(size-indication-mode (8 #(" of %I" 0 6 (help-echo "Size indication mode
mouse-1: Display Line and Column Mode Menu" mouse-face mode-line-highlight local-map (keymap (mode-line keymap (down-mouse-1 keymap (column-number-mode menu-item "Display Column Numbers" column-number-mode :help "Toggle displaying column numbers in the mode-line" :button (:toggle . column-number-mode)) (line-number-mode menu-item "Display Line Numbers" line-number-mode :help "Toggle displaying line numbers in the mode-line" :button (:toggle . line-number-mode)) "Toggle Line and Column Number Display")))))))

(line-number-mode ((column-number-mode (10 #(" (%l,%c)" 0 8 (help-echo "Line number and Column number
mouse-1: Display Line and Column Mode Menu" mouse-face mode-line-highlight local-map (keymap (mode-line keymap (down-mouse-1 keymap (column-number-mode menu-item "Display Column Numbers" column-number-mode :help "Toggle displaying column numbers in the mode-line" :button (:toggle . column-number-mode)) (line-number-mode menu-item "Display Line Numbers" line-number-mode :help "Toggle displaying line numbers in the mode-line" :button (:toggle . line-number-mode)) "Toggle Line and Column Number Display"))))))

(6 #(" L%l" 0 4 (help-echo "Line Number
mouse-1: Display Line and Column Mode Menu" mouse-face mode-line-highlight local-map (keymap (mode-line keymap (down-mouse-1 keymap (column-number-mode menu-item "Display Column Numbers" column-number-mode :help "Toggle displaying column numbers in the mode-line" :button (:toggle . column-number-mode)) (line-number-mode menu-item "Display Line Numbers" line-number-mode :help "Toggle displaying line numbers in the mode-line" :button (:toggle . line-number-mode)) "Toggle Line and Column Number Display"))))))))

((column-number-mode (5 #(" C%c" 0 4 (help-echo "Column number
mouse-1: Display Line and Column Mode Menu" mouse-face mode-line-highlight local-map (keymap (mode-line keymap (down-mouse-1 keymap (column-number-mode menu-item "Display Column Numbers" column-number-mode :help "Toggle displaying column numbers in the mode-line" :button (:toggle . column-number-mode)) (line-number-mode menu-item "Display Line Numbers" line-number-mode :help "Toggle displaying line numbers in the mode-line" :button (:toggle . line-number-mode)) "Toggle Line and Column Number Display"))))))))))

こうして見ればそこまで分かりにくいこともない。上から順に見ていくと、

  1. カーソル位置の総行数に対するパーセンテージを表示する
  2. size-indication-modeが有効のときにファイルサイズを表示する
  3. line-number-modeとcolumn-number-modeが有効のときに表示するタイプ
  4. 行番号だけ表示するタイプ
  5. 列番号だけ表示するタイプ

といった感じ。

それで最初のコードに戻るのだけれど、というかこれを改めて分かったけれど総行数だけなら以下のようにするだけで良い。

(setcar mode-line-position
        '(:eval (format "%d" (count-lines (point-max) (point-min)))))

mode-line-positonはリストだったからパーセンテージ部分の要素?(lisp的にどのように言えば良いのかわからないけど)を入れ替えれば問題ない。なんて簡単なことだったのだろう。

でもmode-line-positionをごそっといじりたいことがある日がくるかもしれないからポジティブに考える。と言いつつもたぶん無いと思っている。しかしながらもう少しきれいに表示したい。現在は、

総行数 (行数 列数)

みたいな形になってるので、たとえば、

総行数/行数 列数

とか考えた。不気味なことしか思いついていない。ほんとに仕様がない。このように何か分かりやすい表示方法はないかと、実はあんまり考えてないけれど現状不満。


あと今日でしたね。帰ったら読ませていただきます。わくわく。

Emacs実践入門 ~思考を直感的にコード化し、開発を加速する (WEB+DB PRESS plus)
4774150029