Emacsのモードラインに現在行、総行、文字位置、選択範囲の文字数などを表示

以下の通り(160714に修正)。

(setq mode-line-position
     '(:eval (format "%d/%d %d/%d %s"
                     (line-number-at-pos)
                     (count-lines (point-max) (point-min))
                     (point)
                     (point-max)
                     (if mark-active
                         (concat "[" (format "%s" (- (region-end) (region-beginning))) "]")
                       ""))))

160714 るびきちさんのEmacs塾で改善の指摘を受けて修正

上記方法をるびきちさんのEmacs塾でるびきちさんに自慢したところ、(:eval

(count-lines (point-max) (point-min))

すると、バッファが大きいときむちゃくちゃ重たくなるよ、とコード例と一緒にご教示を受けたので修正しました。

;;; 前に行番号、総行数、桁番号を表示
;;; 総行数の計する%記法がないので遅延で計算させる
;; thx rubikitch
(defvar-local mode-line-last-line-number 0)
(defvar-local clnaw-last-tick 0)
(defun calculate-total-line-numbers ()
 "Calculate total line numbers."
 (unless (eq clnaw-last-tick (buffer-modified-tick))
   (setq mode-line-last-line-number (line-number-at-pos (point-max)))
   (setq clnaw-last-tick (buffer-modified-tick))
   (force-mode-line-update)))
(run-with-idle-timer 2 t 'calculate-total-line-numbers)

;; 現在行、総行、文字位置、選択範囲の文字数など
(setq mode-line-position
     '(:eval (format "%d/%d %d/%d %s"
                     (line-number-at-pos)
                     mode-line-last-line-number
                     (point)
                     (point-max)
                     (if mark-active
                         (concat "["
                                 (format "%s" (count-lines (region-end) (region-beginning)))
                                 "-"
                                 (format "%s" (- (region-end) (region-beginning)))
                                 "]")
                       ""))))

ジャンル: Emacs