EmacsのMode Lineを強化する


先日はEmacsの検索機能強化について「Emacsの補完&検索を超強化する」にて書かせていただきました.
次はEmacsの視認性を強化していきたいと思います.

まずはMode Line編です!(そのうちBuffer編も書きたいです)

基本設定

まずsmart-mode-lineを導入します!
smart-mode-lineは,特にMode Line用に色々とlispを書かずともいい感じにMode Lineを見やすく&使いやすくしてくれるpackageです!

(defvar sml/no-confirm-load-theme t)
(defvar sml/theme 'dark) ;; お好みで
(defvar sml/shorten-directory -1) ;; directory pathはフルで表示されたいので
(sml/setup)

Emacsでpackageを追加し続けていると,発動しているMinor Modeが多くなってきてしまい,Mode Lineが汚くなっちゃいます
なのでdiminishでMinor Mode名が表示されている部分を見やすくします

(require 'diminish)
(eval-after-load "company" '(diminish 'company-mode) "Comp") ;; 自分でMinor Mode名を定義
(eval-after-load "ivy" '(diminish 'ivy-mode)) ;; 非表示設定(この例だとivyがMinor Mode欄から消える)

また,以下は多分必須設定ですね

(column-number-mode t) ;; 列番号の表示
(line-number-mode t) ;; 行番号の表示

ここまででこんな感じの見た目になると思います

総行数の表示

current bufferの総行数を表示します
なんだかんだあると便利です!

(require 'total-lines)
(global-total-lines-mode t)
(defun my-set-line-numbers ()
  (setq-default mode-line-front-space
        (append mode-line-front-space
            '((:eval (format " (%d)" (- total-lines 1))))))) ;; 「" (%d)"」の部分はお好みで
(add-hook 'after-init-hook 'my-set-line-numbers)

Mode Lineを光らせる

ちょっと面白い改造します
Emacsがbell音を出す設定は切ってると思うんですが,今回はその部分をちょっとだけ置き換えます.
下の設定で,Emacsがbell音を出す代わりにModelineを紫に一瞬光らせます!
「mode-line-bell」「Emacs Wiki」を参照しました)

;; エラー音を鳴らなくする(多分みんなやってる)
(setq ring-bell-function 'ignore)

;; mode line を flash!!
(setq ring-bell-function
      (lambda ()
        (let ((orig-fg (face-background 'mode-line)))
          (set-face-background 'mode-line "purple4")
          (run-with-idle-timer 0.1 nil
                               (lambda (fg) (set-face-background 'mode-line fg))
                               orig-fg))))

また,以下を追記するとsave成功時に緑に光ります!
きちんとsaveできたのかパッと見てわかるようになるのでオススメです!

;; save時にmode line を光らせる
(add-hook 'after-save-hook
      (lambda ()
        (let ((orig-fg (face-background 'mode-line)))
          (set-face-background 'mode-line "dark green")
          (run-with-idle-timer 0.1 nil
                   (lambda (fg) (set-face-background 'mode-line fg))
                   orig-fg))))

Stopwatchを表示する

さらにもう一個だけ面白機能を追加しましょう
みなさん「自分がどれくらいの時間作業していたのか」とか「あとどれくらい集中して作業するべきか」とか考えていたりしませんか?
そういうときに逐一時計を見たり,作業時間をメモるのは面倒ですが,この機能を使えばそのあたりの効率改善ができます!(cf. Emacsでポモドーロテクニック

githubにある拙作stopwatch.elを使います
(制作にあたり@syohexさんのmode-line-timer.elを参考にさせて頂きました)
これを使うと以下のようにMode Line最左端にインクリメンタルタイマーが表示されます!

さらにMacOS向けですが,設定した時間にNotificationが飛んできます

使い方は
1. ~/.emacs.d/stopwatch/stopwatch.elをcopy
2. init.elに以下のコードを記述
3. Emacs上でM-x stopwatch-start
4. Notificationを飛ばしたい方はM-x stopwatch-notification-timeで設定!
5. pauseとstopも同様にM-x stopwatch-pause, M-x stopwatch-stopで出来ます

;; init.elに記述
(add-to-list 'load-path "~/.emacs.d/stopwatch")
(require 'stopwatch)

おわりに

みなさんのMode Line設定もぜひぜひ教えてください!
それではまた!