zsh & tmux で mac のターミナルをより使いやすくカスタマイズ

# はじめに
いろんな種類のシェルがあるが、macOS ではデフォルトで bash が設定されている。
今回は、シェルのカスタマイズということで、bash よりも高機能な zsh を導入する。

## zsh の良い点
- コマンドの補完機能が充実している
- コマンドのスペルミスを修正してくれる
- 複数の zsh 内でコマンド履歴を共有できる
- カスタムテーマを使える
- 細かくカスタマイズできる

# zsh のインストール
## Homebrew の準備
Homebrew がなければ下記のコマンドで Homebrew をインストールする。
このコマンドは[Homebrew の公式サイト](https://brew.sh/index_ja)に記載されている。

```bash
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

インストールできたら brew に問題がないかを下記のコマンで確認する。

```bash
$ brew doctor
Your system is ready to brew.
```

バージョンの確認方法と最新版のインストール方法は以下の通りである。

```bash
$ brew -v
$ brew update
```

## zsh のインストールとログインシェルの変更
まずは zsh がインストールされているかをバージョンで確認。

```bash
$ zsh --version
```

macOS にはもともと zsh が入っているが、バージョンが古いので下記のコマンドで最新のものをインストールする。
PATH 関連の問題で `--disable-etcdir`や`--without-etcdir`をオプションに付けてインストールする方法もある。

```bash
$ brew install zsh
```

ただし、このままだと、もともと入っていた zsh が起動してしまう。
/etc/shells（/private/etc/shells でもいけるみたい）で使用できるシェルを確認すると、Homebrew でインストールした /usr/local/bin/zsh が含まれていないことがわかる。
インストールした zsh を使えるようにするために、/usr/local/bin/zsh を末尾に追記する。

```bash
$ cat /etc/shells
/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
```

ログインシェルを bash から zsh に変更するには下記のコマンドを実行する。

```bash
$ chsh -s /usr/local/bin/zsh
```

# zsh の設定
[zgen](https://github.com/tarjoilija/zgen) というプラグインマネージャで zsh の設定を行う。
zsh の設定は基本的には .zshrc に書く。

## zgen のインストールと設定

```zsh
$ git clone https://github.com/tarjoilija/zgen.git "${HOME}/.zgen"
```

.zshrc に以下を記入する。

```zsh
# load zgen
source "${HOME}/.zgen/zgen.zsh"

# if the init scipt doesn't exist
if ! zgen saved; then

  # specify plugins here
  # ここに追加したいプラグインを記入していく。
  zgen oh-my-zsh
  
  # generate the init script from plugins above
  zgen save
fi
```

記入できたら、下記のコマンドで初期化スクリプトをリセットする必要がある。

```zsh
$ zgen reset
```

これはプラグインの追加や削除のたびにしなければならないが、下記のコマンドで自動化もできる。

```zsh
ZGEN_RESET_ON_CHANGE=(${HOME}/.zshrc ${HOME}/.zshrc.local)
```

.zshrc ファイルを更新したら `source ~/.zshrc`で設定を反映させる。

# TMUX
tmux は端末多重化ソフトウェアである。
1 つのターミナルで操作しているシェルから実行した tmux 上で複数の仮想端末を操作できる。
難しいことはよく分からないが、とりあえず画面を分割できて、サーバのログを見ながらシェルを操作できるのが良い。（iTerm2 でいいやんってのはある）
セッション・ウィンドウ・ペインから成り、セッションは tmux に管理される仮想端末全体、ウィンドウはセッション内に開かれている 1 つの仮想端末の画面全体、ペインは分割されたウィンドウを指す。

## インストールと設定

```zsh
$ brew install tmux
```

tmux の設定は ~/.tmux.conf に記載する。

```
# マウス操作を有効にする
set-option -g mouse on
bind -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'copy-mode -e'"
```

## 使い方
起動中（アタッチしている）の tmux を操作するには、tmux の操作であることを示すためのプレフィックスキー（デフォルトでは ctrl-b）を入力してから、コマンドを入力する。
どのキーがどの操作に対応しているかは ctrl-b+? で表示できる。

### tmux の基本操作

| コマンド | 意味 |
|:-----------------:|:------------------:|
| tmux | tmux を起動してセッションを開始 |
| tmux ls | 起動中のセッションを確認 |
| ctrl-b+$ | セッションの名前変更 |
| tmux lsc | 起動中のセッションに接続されているクライアントを確認 |
| ctrl-b+d | セッションをデタッチ（処理を継続したままセッションを終了 |
| tmux attach -t [target-session] | デタッチしたセッションにアタッチ（オプションでセッションを指定） |
| tmux kill-session -t [target-session] | 起動中のセッションを削除（オプションでセッションを指定） |
| tmux kill-server | 全てのセッションを削除する　（tmuxを終了する） |

### ウィンドウの操作

| コマンド | 意味 |
|:-----------------:|:------------------:|
| ctrl-b+c | 新規ウィンドウを作成 |
| ctrl-b+[ウィンドウ番号] |  ウィンドウの切り替え |
| ctrl-b+n | 上の番号のウィンドウへ切り替え |
| ctrl-b+p | 下の番号のウィンドウへ切り替え |
| ctrl-b+w | ウィンドウの一覧を表示 |
| ctrl-b+& | ウィンドウを削除 |
| ctrl-b+, | ウィンドウの名前変更 |

### ペインの操作（画面分割の操作）

| コマンド | 意味 |
|:-----------------:|:------------------:|
| ctrl-b+" | ウィンドウを水平分割 |
| ctrl-b+% | ウィンドウを垂直分割 |
| ctrl-b+カーソル | ペインのサイズ変更 |
| ctrl-b+o（カーソル） | ペイン間の移動 |
| ctrl-b+q | ペインの番号を表示 |
| ctrl-b+q [ペイン番号] | 指定したペインへ移動 |
| ctrl-b+:display-panes-time [time] | ペイン番号が表示される時間（ミリ秒）を変更 |
| ctrl-b+x | ペイン分割を解除 |

### コピーモード

| コマンド | 意味 |
|:-----------------:|:------------------:|
| ctrl-b+[ | コピーモードの開始 |
| スペース | コピー開始位置決定|
| エンター | コピー終了位置決定 |
| ctrl-b+] | ペースト |
| Cmd+R | マウスでのコピーを可能にする |
| Cmd+R（再）　 | マウスでのコピーを不可能にする |
| option+ドラッグ | マウスでのコピー |

# TPM(Tmux Plugin Manager)
tmux をより便利にするためのプラグイン管理マネージャー。
使用するためにはまず、以下のコマンドで tpm をインストールする。

```zsh
$ git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
```

プラグインは[tmux-plugins](https://github.com/tmux-plugins)に一覧があるため、各プラグインの導入方法と利用方法を確認して ~/.tmux.conf に追記する。

```.tmux.conf
# プラグインリスト
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'

# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'
```

そして、設定ファイルを読み込み、ctrl-b+I でプラグインをインストールできる。（アンインストールする時は ctrl-b+alt+u）

```zsh
$ tmux source ~/.tmux.conf
```

# 参考資料
- [tmuxを使い始めたので基本的な機能の使い方とかを整理してみた](http://kanjuku-tomato.blogspot.com/2014/02/tmux.html)
- [tmuxを必要最低限で入門して使う](https://qiita.com/nl0_blu/items/9d207a70ccc8467f7bab)
- [初心者向け：Zshの導入](https://qiita.com/iwaseasahi/items/a2b00b65ebd06785b443#%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AB%E8%89%B2%E4%BB%98%E3%81%91)
- [達人に学ぶ.tmux.confの基本設定](https://qiita.com/succi0303/items/cb396704493476373edf)
- [tmuxチートシート](https://qiita.com/nmrmsys/items/03f97f5eabec18a3a18b)