Zshを使い始めるにあたってのメモ - Oh My Zshでサクッと見た目を整えて補完機能を有効にする / 便利に使えるhistoryの設定をする

先日の勉強会でターミナルのヒストリーを便利に使う方法を教えてもらいました。
せっかくなので、この機会にbashからzshに乗り換えようと思い立ちました。

この記事では、カジュアル（かつ便利）にターミナルを使いたい方向けに、表示のカスタマイズとヒストリーの設定をご紹介します。

# サクッと見た目を整えて補完機能を有効にする

ターミナルで１行コマンドをうつだけで、いい感じの表示になるとともに補完機能を有効にすることができます。
以下のスクリーンショットでは、"git s"と入力した状態でtabを押した結果、gitコマンドの候補が表示されています。

![スクリーンショット 2020-08-25 12.53.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499615/6d29fab3-cb78-ab3f-faeb-310f2a76b7c8.png)

# Oh My Zsh

Gitのプロンプトの設定方法を調べていたら、Gitの解説ページ[^1]にOh My Zsh[^2]というzshの設定ツールが紹介されていました。
GitHubで11万5千スターを獲得している有名なツールのようです。設定に時間をかけるのも嫌だったので、これを利用することにしました。

[^1]: [A1.5 Appendix A: その他の環境でのGit - ZshでGitを使う](https://git-scm.com/book/ja/v2/Appendix-A%3A-その他の環境でのGit-ZshでGitを使う#roh_my_zsh_git)
[^2]: [Oh My Zsh](https://github.com/ohmyzsh/ohmyzsh)

## たった1行のインストールコマンド

ターミナルで以下のコマンドをうつだけです。
Oh My Zshのリポジトリがローカルにクローンされるとともに、~/.zshrcが作成されます。
既存の.zshrcが存在していても上書きされるので注意してください。

```shell
# 既存の~/.zshrcが上書きされるので、事前にバックアップをとっておくこと
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
```

## プラグインの設定

様々なプラグインがリポジトリに含まれているようです。
以下のように使用するプラグインを指定します。デフォルトではgitのみ有効になっています。

```zsh:~/.zshrc
# 例えば、rubyとrailsのプラグインを使いたい場合は以下のように追加する
plugins=(git ruby rails)
```


# ヒストリーを便利に使う設定

[zshのhistoryを便利に使うためのTips](https://qiita.com/syui/items/c1a1567b2b76051f50c4)を参考にさせていただいて、以下の設定をOh My Zshが自動生成した~/.zshrcに追加しました。
とにかくコマンドの履歴を大量に溜めておくのが、便利に使うポイントだそうです。下記の設定では重複なして10万件まで溜められるようになっています。

```zsh:.zshrc

# For history

# historyを1から時刻のフォーマット付きで表示する
alias all-history="history -i 1"

# 履歴ファイルの保存先 / iCloudで共有できるようにDocuments内に保存
export HISTFILE=${HOME}/Documents/zsh/.zsh_history

# メモリに保存される履歴の件数
export HISTSIZE=10000

# 履歴ファイルに保存される履歴の件数
export SAVEHIST=100000

# 重複を記録しない
setopt hist_ignore_dups

# 開始と終了を記録
setopt EXTENDED_HISTORY

# 同次に起動しているzshからの入力を共有する
setopt share_history

# ヒストリに追加されるコマンド行が古いものと同じなら古いものを削除
setopt hist_ignore_all_dups

# スペースで始まるコマンド行はヒストリリストから削除
setopt hist_ignore_space

# ヒストリを呼び出してから実行する間に一旦編集可能
setopt hist_verify

# 余分な空白は詰めて記録
setopt hist_reduce_blanks 

# 古いコマンドと同じものは無視
setopt hist_save_no_dups

# 補完時にヒストリを自動的に展開
setopt hist_expand

# 履歴をインクリメンタルに追加
setopt inc_append_history

```

## ヒストリーの使い方

ターミナルでCtrl-rを入力すると、以下のようにbck-i-search:という文字列が表示されます。例えば、ここにgitと入力すると、最近の履歴から"git"を含むコマンドがカーソルの表示されている行に表示されます。
繰り返しCtrl-rを押すことで、"git"を含むコマンドの履歴を遡っていくことができます。

![スクリーンショット 2020-08-25 20.35.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499615/fb1afeff-b56f-1d1b-57b0-8882d6fd00b9.png)

Ctrl-rでなかなかお目当てのコマンドにたどり着けない場合は、下記のコマンドで全履歴から任意の単語を含んだコマンドを抽出することができます。（ここでは例として"ls"を検索しています。）

```shell
# 全履歴の一覧をパイプでgrepに渡して、"ls"を含む行を抽出する
all-history | grep ls
```

![スクリーンショット 2020-08-25 20.44.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499615/75f73d4a-2c56-2fec-1ae3-fecce029eda3.png)


## ヒストリー用のキーバインドについて

いくつかのページに以下のようなキーバインドが記載されていたのですが、自分の環境では動きませんでした。

```zsh
bindkey '^P' history-beginning-search-backward
bindkey '^N' history-beginning-search-forward
bindkey "^R" history-incremental-search-backward
bindkey "^S" history-incremental-search-forward
```

代わりに、Ctrl-rで履歴検索を始めた状態で、Option-p/Option-nを入力することで、現在表示されている履歴と同じ単語で始まるコマンドの履歴について行ったり来たりすることができます。[^3] [^4]

[^3]: Windowsの場合はAlt-p/Alt-nです。

[^4]: Macの場合はOptionをメタキーとして使うよう設定している必要があります。"ターミナルの環境設定 > プロファイル > キーボード" から "メタキーとしてOptionキーを使う" にチェックをいれます。

# 参考
[A1.5 Appendix A: その他の環境でのGit - ZshでGitを使う](https://git-scm.com/book/ja/v2/Appendix-A%3A-その他の環境でのGit-ZshでGitを使う#roh_my_zsh_git)
[Oh My Zsh](https://github.com/ohmyzsh/ohmyzsh)
[zshのhistoryを便利に使うためのTips](https://qiita.com/syui/items/c1a1567b2b76051f50c4)
[zshの履歴検索は↑やC-rだけじゃないよM-pもあるよ＆履歴マニアの話](https://masutaka.net/chalow/2014-05-18-2.html)