tmuxでターミナルをより便利に！

# はじめに
ターミナルをより便利に使うことができるCLIアプリケーションである`tmux`について記述しようと思います。

おすすめする読者

- ターミナルでどんなことができるのか調べている人
- ターミナル入門したいの人
- ターミナル入門したばかりの人
- ターミナルを便利にしたい人
- ROS開発者
- Vimmer

# tmux入門
## 個人的な感想
`ターミナルマルチプレクサ`の一つで、類似ソフトとして`screen`などがある。
シェルを分割することで、複数の処理を同時に行いやすくできる。

- ターミナルに搭載されているようなタブ機能より並列作業しやすい
- iTermにある画面分割よりもキーボードのみで操作しやすい(ホームポジションから離れない)
- 複数のターミナルを起動するよりも`Alt+Tab`でのウィンドウ移動を邪魔しない

というイメージである。

- ROS開発のために複数のターミナルを立ち上げる必要のある人
- Vimのためにシェルを使う人
には`tmux`でなくともターミナルマルチプレクサは非常に便利なツールと思われる。

実際に私はエディタはVimを使っており、ターミナルを上下に分割して、

- 上（7,8割)：Vim
- 下(2,3割)：コンパイル・実行・結果確認

のように分割して作業を行なっている。割合自体は気分や確認したい出力の量などで変えている。さらに、他のディレクトリに移動したいときには横に分割して作業を一時的に中断している。

下に、使用例の画面を載せる。普段は全く使わないが、時間を表示することも可能である。

![Screenshot from 2018-10-30 22-53-22.png](https://qiita-image-store.s3.amazonaws.com/0/282145/378d9a01-6503-a238-f742-42afefc20566.png "example")


## インストール方法
Ubuntu、Macにおいて以下のコマンドを実行するだけでインストール完了する。

```sh:for_ubuntu
$ sudo apt install tmux
```

```sh:for_mac
$ brew install tmux
```

## 起動方法

```sh:run_tmux
$ tmux
```

## 基本操作
そのまま、普通のターミナルとして扱うことができます。

ここからが重要なのですが、
tmuxの操作は`Prefixキー ＋ 何か`というキーマッピングで行います。

`Prefixキー`は標準では`Ctrl+b`となっております。また、好みに応じて変更することができますが、その際に他のキーマッピングと衝突してしまわないように注意してください。（私はホームポジションから手を離さないために`Ctrl+f`として設定）

## コマンドリスト
|コマンド|動作|
|---:|---:|
|Prefix + %|横に新しいペインを作成|
|Prefix + "|縦に新しいペインを作成|
|Prefix + x|ペインを削除|
|Prefix + &|ウィンドウの削除|
|$ exit|（実質）ペインの削除|
|Prefix + o|次のペインへ移動|
|Prefix + ←|ペインの移動（左）|
|Prefix + ↑|ペインの移動（上）|
|Prefix + →|ペインの移動（右）|
|Prefix + ↓|ペインの移動（下）|
|Prefix + [|コピーモード|
|q|コピーモード終了|
普段はこれだけで作業していて、とても便利に使えています。

## 時刻表示方法
全く使っていませんが、`Prefix + t`でできます。先ほどの画像はこのコマンドで表示しました。

## tmuxのカスタマイズ
tmuxは`~/.tmux.conf`というファイルでカスタマイズできます。

ここでは、私自身が普段使用している`.tmux.conf`を例として見ようと思います。ネットで漁って作成したものであるため、自分はどの設定が好きなのかで自由に変更すると便利であると思います。特に、Prefixキーは好みが分かれると思います。

```conf:.tmux.conf
#prefixキーをC-fに設定
set -g prefix C-f

# マウス操作を有効にする
set-option -g mouse on

# ウィンドウのインデックスを１から始める
set -g base-index 1

# ペインのインデックスを１から始める
setw -g pane-base-index 1

# 設定ファイルをリロードする
bind r source-file ~/.tmux.conf \; display "Reloaded!"

# \でペインを縦分割
bind \ split-window -h

# -でペインを横分割
bind - split-window -v

# Vimのキーバインドでペインを移動する
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
bind -r C-h select-window -t :-
bind -r C-l select-window -t :+

# 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

# コピーモードの設定（Vim風にする）
setw -g mode-keys vi

# 最後までスクロールダウンするとコピーモードを抜ける
bind-key -n WheelDownPane select-pane -t = \; send-keys -M

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

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

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

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

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

#PCのステータスバーの追加
set-option -g status-right '#(wifi) #(battery --tmux) [%Y-%m-%d(%a) %H:%M]'

#256 color terminal
set -g default-terminal "screen-256color"
```

コメントがついているので操作はわかるかもしれませんが、念の為コマンドリストとして表にしておきます。

`Prefixキー` = `Ctrl + f`

|コマンド|動作|
|:---|:---|
|Prefix + \\ (￥)|横に新しいペインを作成|
|Prefix + -|縦に新しいペインを作成|
|Prefix + x|ペインを削除|
|$ exit|（実質）ペインの削除|
|Prefix + o|次のペインへ移動|
|Prefix + h|ペインの移動（左）|
|Prefix + j|ペインの移動（上）|
|Prefix + k|ペインの移動（右）|
|Prefix + l|ペインの移動（下）|
|Prefix + ←|ペインのサイズ変更（左）|
|Prefix + ↑|ペインのサイズ変更（上）|
|Prefix + →|ペインのサイズ変更（右）|
|Prefix + ↓|ペインのサイズ変更（下）|
|Prefix + [|コピーモード　（vim移動）|
|q|コピーモード終了|
|マウスクリック|ペインの選択|
|コロコロを上に回す|コピーモード移行|
|コロコロで一番下まで戻る|コピーモード終了|

個人的に、このキーマッピングは気に入っております。移動をvim的にするのはよく見かけますが、`Ctrl + f`はあまり見かけないので、よかったら試してください。`CapsLock`を`Ctrl`にしてこの配置にするとホームポジションから小指をクイッと移動すると`Prefix`が押せるので便利です。また、標準ではペイン分割は`Shift`を押す必要がありますが`-`と`\`にすると暇になった右手ですぐにキーを押すことができます。

ペインまたはtmuxを閉じる際は私は`$ exit`を使用しています。

## 最後に
最近は`tmux`の設定は全く触れていないので、他に便利なものがあれば教えていただけると喜びます。