ターミナル内のEmacsは私の懐刀

[Emacs Advent Calendar 2020](https://qiita.com/advent-calendar/2020/emacs) 5日目の記事です。

(1年に1回は.emacs.d/init.elを見直していて、今年はたまたま時期がAdvent Calendarに合いました)

Emacsを起動していろいろな機能を呼び出しながら文字を書いたり読んだりしている間は、ハッカーの仲間入りを果たせているような気がしてとても盛り上がります。まるで、コービーブライアントのファンがレイカーズ24番のジャージを着るように。

とは言っても、私の主力のエディタはEmacsたりえず、TextMate, Sublime Text, Atom, VS Codeなど渡り歩いてきています。しかしどの時期もEmacsは懐刀(ふところがたな)でありました。特に、ターミナル中でプレーンテキストを1つだけ書き換えるような状況で活躍してくれています。こういうニッチな状況であっても自分が満足感を得られる点で気に入っています。

# 懐刀は素早く取り出せなくては

通常、 Emacs を起動するのに `emacs` とはしない。正解は `emacsclient -nw --alternate-editor=''` だが、いちいちこんなことは書いていられないので、 alias しておきましょう。

``` .bash_profile
alias emacs="emacsclient -nw --alternate-editor='' "
```

# Emacs の前にターミナルの設定 

比較的最近書いた [srceryというカラースキームは特にemacsをターミナル内でしか使わない人には良かった](https://qiita.com/ohataken/items/f0b3539e80936901f796) の通りです。

これを書いた後少し調べたのですが、そもそもターミナルとはDECのVT52とかそういうものであって、現代ではこれをエミュレートするもの(ターミナルエミュレーター)を単にターミナルと読んでいるようです。かつてのターミナルは機種によって制御文字とか色数が違っていて、やがてANSIエスケープコードという標準仕様がつくれらて、 Black/Red/Green/Yellow/Blue/Magenta/Cyan/White の8色とそれぞれの淡い色合いの合計16色が使えます。こういうシェルスクリプトを実行するとよくわかります(ターミナルの色がめちゃくちゃになるかもしれないので、新しく立ち上げてからやったほうがよい)。

```
tput setaf 0 && echo "a"
tput setaf 1 && echo "a" 
tput setaf 2 && echo "a"
tput setaf 3 && echo "a"
tput setaf 4 && echo "a"
tput setaf 5 && echo "a"
tput setaf 6 && echo "a"
tput setaf 7
```

ターミナルの中で動く Emacs はこのANSIエスケープコードの8色(16色)の影響を受けるので、ターミナルのカラースキームと Emacs のカラースキームを合わせることが重要なようです。

# Emacs のカラースキームを設定する

これも[srceryというカラースキームは特にemacsをターミナル内でしか使わない人には良かった](https://qiita.com/ohataken/items/f0b3539e80936901f796) の通りです。

# パッケージマネージャ 

これから Emacs を拡張するパッケージをいくつも追加していくのでパッケージマネージャーを導入します。前世代のいくつかのパッケージマネージャーは一長一短あったけど、今回使う straight.el はお手軽にして十分で、ぜひ記事を書いて紹介したいと思ったきっかけのひとつです。

(※今は leaf がよいっぽいです。[2020年代のEmacs入門](https://emacs-jp.github.io/tips/emacs-in-2020#emacs%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB))

完全におまじないだけど、これを ~/.emacs.d/init.el に書くことですべて完了してしまう。

```
 (defvar bootstrap-version)
(let ((bootstrap-file
       (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
      (bootstrap-version 5))
  (unless (file-exists-p bootstrap-file)
    (with-current-buffer
        (url-retrieve-synchronously
         "https://raw.githubusercontent.com/raxod502/straight.el/develop/install.el"
         'silent 'inhibit-cookies)
      (goto-char (point-max))
      (eval-print-last-sexp)))
  (load bootstrap-file nil 'nomessage))

(straight-use-package 'use-package)
(setq straight-use-package-by-default t)
``` 

# 貧弱な標準の挙動をモダンにする

標準の挙動が本当にひどいので、とりあえず入れておいてほしいものがこれです。

```
(use-package counsel
  :init
  (counsel-mode 1)
  :bind (
    "C-x b" . counsel-switch-buffer))

(use-package ivy-rich
  :config
  (setcdr (assq t ivy-format-functions-alist) #'ivy-format-function-line)
  (ivy-rich-mode 1))

(use-package ivy-prescient
  :config
  (custom-set-variables '(prescient-save-file (locate-user-emacs-file "tmp/prescient-save.el")))
  (ivy-prescient-mode t)
  (prescient-persist-mode t))

(use-package smooth-scrolling
  :init
  (setq smooth-scroll-margin 1)
  :config
  (smooth-scrolling-mode t))

(use-package smart-mode-line
  :config
  (setq sml/theme 'respectful)
  (setq sml/no-confirm-load-theme t)
  (sml/setup))
```

特に紹介したいのが ivy で、これは Emacs の操作性を別次元に高めたし、CUIアプリ(ターミナル上で対話的にキーボード入力を受け付けるアプリ?)としてかなり洗練されているんじゃないかとも思います。いわゆる候補選択インターフェイスというやつです。

ivy-prescient はコマンド候補を使用頻度順に並べてくれるパッケージで、それまでは smex というほぼ同等の機能だが ido という anything 以前のインターフェイスの流儀で動くものを使っていたのですが、これでようやく ivy でもその機能が手に入りました。ダウンロード数が ivy 本体と比べて極めて少ないので、ぜひ紹介したいと思っていました。

(が、[2020年代のEmacs入門](https://emacs-jp.github.io/tips/emacs-in-2020#emacs%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)で紹介されていますw) 

smart-mode-line は画面の下端のステータスバーみたいな領域を色付けするだけの完全なるお飾りだけれど、ターミナル内でリッチな体験を求めてカラースキームを導入しているので、ぜひこれも導入して満足度を高めましょう。

# 完成

![スクリーンショット 2020-12-04 1.18.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10698/b9d30a24-e518-7923-8a24-511d69173b60.png)

* .git/config
* .bash_profile
*  /etc/hosts
* git rebase

私は開発時に git rebase を多用するスタイルですが同様の方は、 `export EDITOR="TERM=xterm-256color emacsclient -nw -a ''"` しておくとさらに日常のコーディングに懐刀としてEmacsを忍ばせることができます。

また、競技プログラミングやるときも単一のcppファイル開くことが多いので、役に立っています(紹介しなかったが、これをやる場合は irony とか強化したほうがいい)。

痒いところに手が届く、しかもあこがれのある道具で、っていうのがうれしいです。