EmacsのMode Lineを強化する

先日はEmacsの検索機能強化について[「Emacsの補完&検索を超強化する」](https://qiita.com/blue0513/items/c0dc35a880170997c3f5)にて書かせていただきました．
次はEmacsの視認性を強化していきたいと思います．

まずはMode Line編です！（そのうちBuffer編も書きたいです）

# 基本設定

まず[smart-mode-line](https://github.com/Malabarba/smart-mode-line)を導入します！
`smart-mode-line`は，特にMode Line用に色々とlispを書かずともいい感じにMode Lineを見やすく&使いやすくしてくれるpackageです！

```el
(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](https://github.com/myrjola/diminish.el)でMinor Mode名が表示されている部分を見やすくします

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

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

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

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

<img width="NaN" alt="modeline.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/144707/e23ca229-ff14-df13-04d0-3d7750be25e4.jpeg">


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

```el
(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)
```

<img width="NaN" alt="total_line.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/144707/89e93f05-1b6e-e486-b8e9-3a338c11b62b.jpeg">


# Mode Lineを光らせる
ちょっと面白い改造します
Emacsがbell音を出す設定は切ってると思うんですが，今回はその部分をちょっとだけ置き換えます．
下の設定で，Emacsがbell音を出す代わりにModelineを紫に一瞬光らせます！
（[「mode-line-bell」](https://github.com/purcell/mode-line-bell)と[「Emacs Wiki」](https://www.emacswiki.org/emacs/AlarmBell#toc3)を参照しました）

```el
;; エラー音を鳴らなくする（多分みんなやってる）
(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できたのかパッと見てわかるようになるのでオススメです！

```emacs-lisp
;; 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))))
```

![Untitled5.gif](https://qiita-image-store.s3.amazonaws.com/0/144707/31f2bc1a-8cbd-cdd2-49ec-7ff7bedfd363.gif)

# Stopwatchを表示する
さらにもう一個だけ面白機能を追加しましょう
みなさん「自分がどれくらいの時間作業していたのか」とか「あとどれくらい集中して作業するべきか」とか考えていたりしませんか？
そういうときに逐一時計を見たり，作業時間をメモるのは面倒ですが，この機能を使えばそのあたりの効率改善ができます！（cf. [Emacsでポモドーロテクニック](https://qiita.com/syohex/items/db61d0e08c344afec3fd)）

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

<img width="630" alt="working.png" src="https://qiita-image-store.s3.amazonaws.com/0/144707/e0274c59-d036-f231-30c9-107f195ba840.png">

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

<img width="372" alt="33809300-2e0c9878-de38-11e7-912f-cabab3c9f773.png" src="https://qiita-image-store.s3.amazonaws.com/0/144707/2eea5cba-c19a-c73e-70c4-fe7aac8dc00c.png">


使い方は
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`で出来ます

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

# おわりに
みなさんのMode Line設定もぜひぜひ教えてください！
それではまた！