tmuxを必要最低限で入門して使う

#はじめに
今回は、端末多重化ソフトウェアのtmuxを学習していきます。これにより、ターミナル画面を複数開いたり、ターミナルソフト独自のショートカットキーを覚えてペインを分けたりするみたいな非効率的な開発環境を改善していきます。
タイトルの「必要最低限」とは、これらの新しいソフトの学習に時間をかけたくないので、**私が使っているtmuxの機能・設定だけをピックアップして本記事に記述するという意味です。**

#開発環境
* Mac OS X El Capitan
* Homebrew 1.6.3 (パッケージマネージャー) 
* tmux 2.7 

#tmux
## tmuxとは
tmuxは端末多重化ソフトウェアと表現されるが、要は1つのターミナル上で複数のターミナルを立ち上げて同時並行で作業できるものと思ってもらえれば良い。
パッケージとしてインストールすることができ、サーバ側でインストールしていればSSHを通じてクライアント側からもtmuxを利用できる。また、後に詳しく説明するが1つのセッションだけでなく複数のセッションを扱えるという特徴を持っている。

**よって以下のような従来の作業を改善できる。**

> * 複数タスクを動かしたいので、その数だけターミナルウィンドウを開いた  
>> →**tmuxを使えばウィンドウを分割して1つのターミナル上で複数のターミナルを立ち上げて同時並行で作業できます**

> * リモートマシンで複数タスクを動かすため、その数だけSSHセッションを開いた  
>> →**tmuxはサーバにインストールされてれいればSSH越しでも利用できます**

> * OS毎にターミナルソフトが違うのでショートカットキーをその度に覚えている
>> →**.tmux.conf(設定ファイル)を各OSで共有すればショートカットも共通にすることができます**

> * ウィンドウを複数分割したらペインが小さくなったので、別のウィンドウを開いた  
>> →**tmuxは複数ウィンドウをセッションという単位で、1つのターミナルで扱うことができます**

> * ターミナルで作業してたら、フリーズしてやり直しになった  
>> →**tmuxはセッション記憶できるので、フリーズ前の状態から再開できます**

> * SSHを通じて作業をしてたら、回線が切れてやり直しになった  
>> →**tmuxはセッション記憶できるので、回線断前の状態から再開できます**

> * ターミナルの画面を共有して作業したい！！  
>> →**各tmuxウィンドウはSSHクライアントやホストOSで共有できます**

## tmuxの構成要素

* セッション
1つ以上のウィンドウを管理しているターミナル全体

* ウィンドウ
セッション内に開かれている、1つ以上のペインを管理しているターミナル全体

* ペイン
ウィンドウ内で分割されている1つのターミナル

分かりくいがいかがtmux画面の例である。
2つのセッションがあり、セッション1は1つのウィンドウ、セッション2は2つのウィンドウを管理している。

<img width="1055" alt="スクリーンショット 2018-05-05 18.11.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/161771/29c0080c-7d91-66f2-4fda-15e0e3735884.png">

セッション2における1つのウィンドウは3つのペインを管理している。

<img width="1057" alt="スクリーンショット 2018-05-05 17.12.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/161771/0db9b21b-b875-c721-ed40-7d333467bfbe.png">

## tmuxのインストール

Mac OSXにおけるtmuxのインストール

```
$ brew install tmux
```

## .tmux.conf

tmuxにおける設定は~/.tmux.confで管理している
設定については以下のサイトを参考にさせていただきました。

* [達人に学ぶ.tmux.confの基本設定](https://qiita.com/succi0303/items/cb396704493476373edf)
* [tmuxが快適、かつ .tmux.conf の設定](https://qiita.com/murachi1208/items/36d7676558d5535b44db)

以下が最終的に私が設定したものです。一部、環境によって必要ない設定もあります(zshなど)
**以降ではこのファイルに基づいた、操作を説明します**

```
vim ~/.tmux.conf
```

```.tmux.conf
# tmux起動時のシェルをzshにする
set-option -g default-shell /bin/zsh

# tmuxを256色表示できるようにする
set-option -g default-terminal screen-256color
set -g terminal-overrides 'xterm:colors=256'

# prefixキーをC-qに変更
set -g prefix C-q

# C-bのキーバインドを解除
unbind C-b

# ステータスバーをトップに配置する
set-option -g status-position top

# 左右のステータスバーの長さを決定する 
set-option -g status-left-length 90
set-option -g status-right-length 90

# #P => ペイン番号
# 最左に表示
set-option -g status-left '#H:[#P]'

# Wi-Fi、バッテリー残量、現在時刻
# 最右に表示
set-option -g status-right '#(wifi) #(battery --tmux) [%Y-%m-%d(%a) %H:%M]'

# ステータスバーを1秒毎に描画し直す
set-option -g status-interval 1

# センタライズ（主にウィンドウ番号など）
set-option -g status-justify centre

# ステータスバーの色を設定する
set-option -g status-bg "colour238"

# status line の文字色を指定する。
set-option -g status-fg "colour255"

# vimのキーバインドでペインを移動する
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# vimのキーバインドでペインをリサイズする
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5

# | でペインを縦分割する
bind | split-window -h

# - でペインを縦分割する
bind - split-window -v

# 番号基準値を変更
set-option -g base-index 1

# マウス操作を有効にする
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'"

# コピーモードを設定する
# コピーモードでvimキーバインドを使う
setw -g mode-keys vi

# 'v' で選択を始める
bind -T copy-mode-vi v send -X begin-selection

# 'V' で行選択
bind -T copy-mode-vi V send -X select-line

# 'C-v' で矩形選択
bind -T copy-mode-vi C-v send -X rectangle-toggle

# 'y' でヤンク
bind -T copy-mode-vi y send -X copy-selection

# 'Y' で行ヤンク
bind -T copy-mode-vi Y send -X copy-line

# 'C-p'でペースト
bind-key C-p paste-buffer
```

## 基本操作

基本操作については[tmuxチートシート](https://qiita.com/nmrmsys/items/03f97f5eabec18a3a18b)が参考になります。
.tmux.confを設定している場合は、ほとんどがこれによらないので注意。
以下は前項の.tmux.confに基づくコマンドです。よく使うものだけ説明します。

* tmux起動(セッション開始)

```
$ tmux
```

* tmuxセッション一覧

```
$ tmux ls
```

* tmuxを再開(セッション再開)

```
$ tmux a [-t <対象セッション名>]
```

* tmuxを終了(セッション終了)

```
$ tmux kill-session [-t <対象セッション名>]
```


## ショートカットキー

**tmuxによるペイン分割や新たなセッションの作成などのショートカットキーはすべてprefixと呼ばれる特定キーを押してから、次に対象のキーを押すことで実行される**

デフォルトのprefixは`Ctrl+b`だが、片手で押すのがキツイので私の.tmux.confでは`Ctrl+q`に設定している。まず、`Ctrl`と`q`を同時に押して、次に対象のキーの入力である。すべて同時押しではないことに気をつける。

では、一気によく使うショートカットを説明します。

|コマンド|役割|
|:---:|:---:|
|prefix + ?|キーバインド一覧|
|prefix + s|セッションの一覧表示|
|prefix + c|新規ウィンドウ作成・追加|
|prefix + w|ウィンドウの一覧|
|prefix + &|ウインドウの破棄|
|prefix + n|次のウインドウへ移動|
|prefix + p|前のウインドウへ移動|
|prefix + &#124;|左右にペイン分割|
|prefix + -|上下にペイン分割|
|prefix + h|左のペインに移動|
|prefix + j|下のペインに移動|
|prefix + k|上のペインに移動|
|prefix + l|右のペインに移動|
|prefix + H|ペインを左にリサイズ|
|prefix + J|ペインを下にリサイズ|
|prefix + K|ペインを上にリサイズ|
|prefix + L|ペインを右にリサイズ|
|prefix + x|ペインの破棄|
|prefix + スペース|ペインのレイアウト変更|
|prefix + Ctrl + o|ペインの入れ替え|
|prefix + {|ペインの入れ替え(上方向)|
|prefix + }|ペインの入れ替え(下方向)|
|prefix + [|コピーモードの開始(カーソルキーで移動)|
|prefix + v|コピー開始位置決定(viモード)|
|prefix + y|コピー終了位置決定(viモード)|
|prefix + Crtl + p|コピー内容の貼り付け|

# おわりに
長くなりましたがtmuxの説明でした。参考記事の著者には感謝いたします。
tmuxはその他にも多くのショートカットや機能があるので、興味のある方はネットなどで調べてみると面白いです。マウスの使わないコンピューティングをこれからも意識していきたいですね。
近々、dotfilesやansibleを用いたvim,zsh,tmuxの一括設定についても記事を書こうと思っています。