vimのキーバインド風にtmuxのよく使う操作をチュートリアルっぽく解説

TECH::CAMPアドベントカレンダー１日目は、犬系エンジニア :dog: こと、さ犬 [<a href="http://qiita.com/saino-katsutoshi" target="_blank">Qiita</a>|<a href="https://twitter.com/kattyan310" target="_blank">twitter</a>|<a href="https://github.com/sa-inu" target="_blank">github</a>] が担当します！

書くことが前日に決まり、今(2016/11/30 17:11:08)から新しい技術を勉強したり、何か作ったりするのは現実的ではないので、すでに手元にあるものでみなさんの役に立ちそうなことを記事にします。🙉


内容はタイトル通り、 **tmux** です。すでにエンジニアでやっている人は当然入れてますよね？新米エンジニアの人はまだ知らない人もいるかと思います。

ここではそんなtmuxを使ったことがない人でも基本操作を身につけるようにするために、チュートリアルのように前から順番にステップアップできるようになってます。是非自分の手を動かしてやってみてください！

# tmuxとは

みなさんCLI(Command Line Interface)は使っていますか？
CLIは、MacならターミナルやiTerm、Windowsならコマンドプロンプトなどがあります。
（以降ターミナルとします。windowsユーザはコマンドプロンプトに置き換えてください）

CLIと比較されるのが、GUI(Graphic User Interface)があります。これはGoogle ChromeやIllustrator、Finderなどなど、普段マウスでぽちぽち使っているものです。

tmuxはCLIで使うツールです。

何ができるようになるか噛み砕くと、 **一つのターミナルウィンドウ上で複数のターミナルを起動する** ことができます。


## tmuxの強み


最大の強みは、 **バックグラウンド起動** です。

ターミナルの画面一つで複数のプロジェクトを同時に進めることができます。また、リモートサーバーにssh接続してtmuxを使うと、途中で接続が切れてもtmuxのプロセスは残るので、途中から再開できるという便利さが素晴らしいです！
今回はローカルで、ターミナルのタブやウィンドウをたくさん開いているそこのアナタ！tmuxを使って解決します。


## tmuxをインストール

とりあえずmacでtmuxを起動するので、macにtmuxをhomebrewでインストールします。（windowsの人はごめんなさい）
前提としてhomebrewをインストールしておいてください。

```
$ brew install tmux reattach-to-user-namespace
```

これでインストールが完了です。(reattach-to-user-namespaceがないとエラーが出るそうです）

## tmuxの概要


tmuxは、 **session（セッション)** 、 **window（ウィンドウ）** , **pane（ペイン）** の組み合わせで構成されます。

ターミナル | tmux
:-: | :-:
ウィンドウ | session
タブ | window
画面 | pane

![session.png](https://qiita-image-store.s3.amazonaws.com/0/86426/f6fae066-f4b8-2ac6-82f1-38da1b37df1a.png)


tmuxは、それぞれのセッションに名前をつけてバックグラウンドで起動します。
実際にコマンドを打ち込むのは、セッションの中のペインで行います。


例えば、３つのプロジェクトを作業している場合、以下のようにセッションごとに分けることでバックグラウンドで実行しておくことができます。

* session1・・・プロジェクトA
* session2・・・プロジェクトB
* session3・・・プロジェクトC


![structure.png](https://qiita-image-store.s3.amazonaws.com/0/86426/4ec92175-122e-a045-977b-c9e1fe6448a5.png)


バックグラウンドにあるセッションをターミナルに取り付けることを、 **アタッチ** と呼びます。その反対で、セッションをターミナルから切り離すことを **デタッチ** と呼びます。


ここまででtmuxの概念的な説明は終わりなので、次に使い方を説明します。


# tmuxの使い方

以降の記号の表記と意味について先に書いておきます。

ショートカットキー | 手順
--- | ---
`command-c` | commandとcを同時に押す
`command-c 1` | commandとc同時押し後、両方離してから1を押す


これから紹介するショートカットキーはデフォルトのキーではなく僕のオススメのショートカットキーです。ご注意ください。

**※僕のtmuxは設定ファイルを変更しているので以下のコマンドを実行して設定ファイルをダウンロードしてください。この記事を読み終えたら `~/.tmux.conf` を変更すればtmuxのカスタマイズができます。**

```
$ brew install wget && cd ~ && wget https://raw.githubusercontent.com/sainuio/dotfiles/master/home/.tmux.conf
```

## tmuxの起動

```
$ tmux
or
$ tmux new -s 任意のセッション名
```

デフォルトのtmuxでは下に緑のバーが出ます。
![](https://i.gyazo.com/9ebadded95835146398ee22ff4741ca0.gif)

これはtmuxの起動と同時にアタッチを行います。
また今windowとpaneが一つずつ開かれてる状態です。

![start.png](https://qiita-image-store.s3.amazonaws.com/0/86426/a2829ebd-13f0-0181-37f5-e4ac193d85d0.png)


## prefix

tmuxの操作を行う時、以下のように必ず２つのキーの組み合わせで行います。

**prefix**, **キー**

tmuxのデフォルトのprefixは、 `ctrl-b` です。

したがって、何か操作を行う時は以下のようにキーを入力します。

`ctrl-b key`


## paneを作る（画面分割）

tmuxでは画面分割が自由にできることも強みです。

### 縦分割

`ctrl-b v` (v・・・vertical)
(tmuxデフォルトキーバインド: `ctrl-b %`)

![](https://i.gyazo.com/6eea16bebe9cd1b3bc422134a7e49c4e.gif)

### 横分割

`ctrl-b w` (w・・・wide)
(tmuxデフォルトキーバインド: `ctrl-b "`)

![](https://i.gyazo.com/566b5e332d5e43f3b56e513eeb20b32e.gif)

この時点で以下のような構成になってます。

![start-2.png](https://qiita-image-store.s3.amazonaws.com/0/86426/0c1131e3-24e7-31f8-7c35-19f9f804e757.png)


## paneの移動

### 上へ

`ctrl-b k` (k・・・vimの上)


### 右へ

`ctrl-b l` (l・・・vimの右)


### 下へ

`ctrl-b j` (j・・・vimの下)

### 左へ

`ctrl-b h` (h・・・vimの左)


## paneの幅調整

### 左右

`ctrl-b shift-[l連打(右) or h連打(左）]`

![](https://i.gyazo.com/e33ae171f9b5e3a83205f3e2c7bde846.gif)

### 上下

`ctrl-b shift-[k連打(上) or j連打(下）]`

![](https://i.gyazo.com/f9393af568096c2b2995d2adabb3b30a.gif)

## windowの作成

`ctrl-b c` (c・・・create)
(tmuxデフォルトキーバインドも同じ)

![](https://i.gyazo.com/079eb88fe3c68230893e9b1424e8198a.gif)

この時点ではこんな感じです。

![start-3.png](https://qiita-image-store.s3.amazonaws.com/0/86426/f92bf6d7-cf75-321d-2eb1-aea068960557.png)


## windowの移動

### 右へ

`ctrl-b ctrl-l`
(tmuxデフォルトキーバインド: `ctrl-b n`)

### 左へ

`ctrl-b ctrl-h`
(tmuxデフォルトキーバインド: `ctrl-b p`)


## windowの名前変更

`ctrl-b ,`
(tmuxデフォルトキーバインドも同じ）

![](https://i.gyazo.com/0b2c01d59310aa0ec5a0ea206e24f66e.gif)


## デタッチ

`デタッチ` とは今ターミナルと接続しているセッションを切り離す行為です。

`ctrl-b d`（d・・・detache）
(tmuxデフォルトキーバインドも同じ)

![](https://i.gyazo.com/0ea559b51d2eaf361faf882b9752f50d.gif)


## セッション一覧を表示

```
$ tmux ls
=> 0: 2 windows (created Wed Nov 30 20:16:46 2016) [146x43]
```

この場合 `0` がセッション名です。

## アタッチ

`アタッチ` とはバックエンドで起動しているセッションをターミナルに接続する行為です。
ターミナルで以下のコマンドを実行します。

```
$ tmux a -t セッション名
```

これでセッションに復帰できます。


## セッションの名前を変更

```
$ tmux rename -t 変更前のセッション名 変更後のセッション名
```

例）

```
$ tmux ls
=> 0: 2 windows (created Wed Nov 30 20:16:46 2016) [146x43]
$ tmux rename -t 0 hoge
```


## 新しいセッションを名前付きで作成

```
$ tmux new -s セッション名
```

これを実行したらこのような状況になります。

![start-4.png](https://qiita-image-store.s3.amazonaws.com/0/86426/eadc229b-ce52-6042-f6fb-d53b4336c39c.png)


## 別のセッションに移動する

以下のショートカットキーを入力すると、セッション一覧を表示する新しい画面が表示されます。
移動したいセッションのインデックス番号を入力すればセッション間の移動も簡単に行えます。
また、選択バーを上下に移動させて、エンターキーでセクション移動も可能です。

`ctrl-b s`
(tmuxデフォルトキーバインドも同じ)

![](https://i.gyazo.com/4f32886550f0976f1c9a2ab1934bb81a.gif)

## ターミナルを閉じてみる


tmuxはバックグラウンドで処理を保持しているのでターミナルを閉じてもセッションは残ります。
試しに、ターミナルを終了（command-q)をして完全に閉じてしまってください。
そのあともう一度ターミナルを起動しましょう。

```
$ tmux ls
```


すると、セッションが残ってます！
セッションにアタッチしてみましょう。

```
$ tmux a -t セッション名
```

しっかり残ってますね！
（※ただしpc自体を再起動すると当然ですがセッションは消えます）


## コピー

※これはvimの知識が必要になります。
実はtmux内ではマウスで使うことを想定されていないので、コピーもコマンドで行う必要があります。

`ctrl-b [`

これでコピーモードに切り替わります.

`h`(左), `j`(下), `k`(上), `l`(右)で移動ができます。
`v`でvisualモードになり、`y`でコピーができます。
コピーしたものは、 `command-v` でペーストができます。(tmuxデフォルトキーバインド: `ctrl-b ]`)

![](https://i.gyazo.com/eabc32d41aadfd1aa420146196ec4d11.gif)

ここまで終えると大体の基本操作は終了です。

次に削除系のコマンドを紹介します。

## セッションの削除

```
$ tmux kill-session -t 削除するセッション名
```

## ウィンドウの削除

```
$ tmux kill-window -t 削除するウィンドウ名
```


## ペインの削除

```
$ tmux kill-pane -t 削除するペイン名
```

## （番外編）時計を表示

これはお好みでw

`ctrl-b t`
(tmuxデフォルトキーバインドも同じ)

![](https://i.gyazo.com/d7d6533ceea6f2a3e79b81352b1c441e.gif)


## （番外編）ステータスバーにwifiやバッテリー情報を表示する

以下のコマンドで必要なファイルをダウンロードすれば設定できます。

```
$ cd ~ && rm ~/.tmux.conf && wget https://raw.githubusercontent.com/sainuio/dotfiles/master/home/.tmux.conf && wget https://raw.githubusercontent.com/sainuio/dotfiles/master/home/get_volume_tmux.sh && wget https://raw.githubusercontent.com/sainuio/dotfiles/master/home/getwifi.sh
```

この後にtmuxを再起動すれば以下の画像のように右上のステータスバーのところに反映されてると思います。

![](https://i.gyazo.com/13b79dd7e3c936e63c332dfe7213cfd2.png)


# 終わり

vimを使ってる僕の好みのキーバインドを勝手に押し付けてすみません。
ただこのキーバインドすごくやりやすくてオススメなので、もしよかったら `~/.tmux.conf` の中身を確認してみてください 💕
もし設定をリセットしたければ、 `~/.tmux.conf` を削除すれば設定はリセットされます！
！
tmux習得して来年からまた頑張りましょう！ :tada: