Emacs の見た目だけをモダン化（NS版，26.1）

# Emacs の見た目だけをモダン化します．

Mac で Emacs を使っている人は，次の例のように見た目をちょっとモダン化できます．以下にその設定群を示します．

![DeDVvjAV0AA1z3x.png](https://qiita-image-store.s3.amazonaws.com/0/12232/a891a10c-30c0-5b99-e926-b1440a577e1e.png)

![DeG8VY3VAAASTJH.png](https://qiita-image-store.s3.amazonaws.com/0/12232/1e52b2ec-faca-083e-2f92-123f61c4c18c.png)

## とにかくパーツを隠す

Emacsフレームのパーツを徹底的に隠すことで，上記のようなスッキリした見た目が得られます．特にモードラインを消すとかなりスッキリします．ただしその一方で必要な情報が表示されなくなるので，比較的上級者向けと言えます．私の場合は，通常はモードラインも消していて，必要に応じていつでもトグルで復活できるようにしています．

### ツールバー

不要です．消しましょう．

```emacs-lisp
(when (display-graphic-p)
  (tool-bar-mode -1))
```

### 余白・スクロールバー・タイトルバー

NS版ではフリンジとテキストエリアの間に，微妙な隙間が空いていますので，これを消します．加えて，縦方向のスクロールバーを消して，さらに，タイトルバーを透過させます．

```emacs-lisp
(when (memq window-system '(mac ns))
  (setq initial-frame-alist
        (append
         '((ns-transparent-titlebar . t) ;; タイトルバーを透過
           (vertical-scroll-bars . nil) ;; スクロールバーを消す
           ;; (ns-appearance . dark) ;; 26.1 {light, dark}
           (internal-border-width . 0))))) ;; 余白を消す
(setq default-frame-alist initial-frame-alist)
```

### テーマに合う appearance を設定する

上記 initial-frame-alist の設定でコメントアウトしている ns-appearance をアンコメントアウトして，利用中のテーマに合わせた値を入れます．`light`か`dark`です．

この値は，気軽に変えられるので，テーマを変える時にも変更可能です．例えばこんな感じで，ダーク系のテーマを読み込む時に，`default-frame-alist` を更新すればOKです．

```emacs-lisp
(when (require 'night-theme nil t) ;; night-theme はプライベートテーマ．適宜書き換えてください．
    (mapc 'disable-theme custom-enabled-themes)
    (load-theme 'night t) ;; ここも適宜書き換えてください．
    (add-to-list 'default-frame-alist '(ns-appearance . dark)))
``` 

### モードラインを隠す

以下の設定を使うと，任意のファイルを開く時にモードラインが隠されます．`my-toggle-mode-line` を呼べば，いつでもモードラインを表示できるので安心です．普段は表示しておきたいという場合は，最終行の `add-hook` をコメントアウトすればOKです．

```emacs-lisp
(set-default 'my-mode-line-format mode-line-format)
(defun my-mode-line-off ()
  "Turn off mode line."
  (setq my-mode-line-format mode-line-format)
  (setq mode-line-format nil))
(defun my-toggle-mode-line ()
  "Toggle mode line."
  (interactive)
  (when mode-line-format
    (setq my-mode-line-format mode-line-format))
  (if mode-line-format
      (setq mode-line-format nil)
    (setq mode-line-format my-mode-line-format)
    (redraw-display))
  (message "%s" (if mode-line-format "( ╹ ◡╹)ｂ ON !" "( ╹ ^╹)ｐ OFF!")))
(define-key moom-mode-map (kbd "<f5>") 'my-toggle-mode-line)
(add-hook 'find-file-hook #'my-mode-line-off)
```

## 起動時にフレームがフラッシュするのを抑制する

起動後に`initial-frame-alist`を書き換えて余白を消したりスクロールバーを消すと，Emacsのフレームがフラッシュするので見た目が悪いです．これはソースコードレベルで書き換えないとダメなので，パッチの出番です．次のパッチを当ててEmacsをビルドすればOKです．

https://gist.github.com/takaxp/01ff965361d70de93e9aba3795193cc7

せっかくなのでIMEパッチごと当ててくださいw
（ => https://qiita.com/takaxp/items/e07bb286d80fa9dd8e05 ）

なおこの場合は，`initial-frame-alist` には `ns-transparent-titlebar` だけを残せばOKです．あるいは，次のようにすれば，`initial-frame-alist`に残す必要も無いです．

```emacs-lisp
(add-to-list 'default-frame-alist '(ns-transparent-titlebar . t)
```

## バッファの終わりをフリンジで確認

モードラインを消した状態でウィンドウを分割すると，バッファの区切りめが曖昧になりちょっと大変です．そんな時は，バッファの終わりをフリンジに表示すれば，少しわかりやすくなります．

```emacs-lisp
(setq-default indicate-buffer-boundaries
              '((top . nil) (bottom . right) (down . right)))
```

## カーソルのあるバッファを強調

[dimmer.el](https://github.com/gonewest818/dimmer.el) を使うと，カーソルのあるバッファだけ強調してくれます．実際は，現在のバッファ以外のトーンを少し落としてくれます．これでモダン化した状態でも今どこに居るのかわかりやすくなります．~~ただし，Helm との相性があまり良くないです．なのでお好みで設定ください．~~ コメントももらいましたが，`dimmer-exclusion-regexp` を設定すると改善します．またそれらの問題を改良する目的のPRも出されています．

```emacs-lisp
(when (require 'dimmer nil t)
  (setq dimmer-fraction 0.6)
  (setq dimmer-exclusion-regexp "^\\*helm\\|^ \\*Minibuf\\|^\\*Calendar") 
  (dimmer-mode 1))
(with-eval-after-load "dimmer"
  (defun dimmer-off ()
    (dimmer-mode -1)
    (dimmer-process-all))
  (defun dimmer-on ()
    (dimmer-mode 1)
    (dimmer-process-all))
  (add-hook 'focus-out-hook #'dimmer-off)
  (add-hook 'focus-in-hook #'dimmer-on))
```

実際に動かしてみると，こんな感じになります．良きかな．
![Untitled.gif](https://qiita-image-store.s3.amazonaws.com/0/12232/704082d0-6fd1-f0f8-7846-7cf0378a9718.gif)


## References
- https://github.com/d12frosted/homebrew-emacs-plus/issues/55
- https://github.com/gonewest818/dimmer.el