（たぶん）君はまだtmuxの真の力を引き出せていない


## 目次
- tmuxとは
- 起動して新規セッションを作成する
- windowを作成する
- window間を行き来する
- windowを分割してpaneを作成する
- paneを行き来する
- セッション間を行き来する
- 【応用】tmuxの表示内容をリダイレクトする
- 【応用】情報バーにgitのbranch名を表示する
- 【応用】現在の操作パスを表示する
- 【応用】スニペットを呼び出す
- 以上の設定の `.tmux.conf` はこちら 
- tmuxはバージョン互換性がかなり微妙
- YouTubeでも公開したのでチャンネル登録してくれると嬉しいです


## tmuxとは

tmuxとはターミナルマルチプレクサと言われるもので、sshで作業マシンにログインして操作した際や、重いプログラムを実行するなどして帰りたいが終了せずに作業を継続したい際などが、最も簡単なユースケースです。

これだけにとどまらず、tmuxはterminalを複雑に装飾できるほか、さまざまな便利な使い方があるので実際の使用をgifアニメで録画したものを用いてご紹介します。

また、vimのようにmodeの概念があり、prefixという予約されたキーバインドがあり、これを入力することで、modeの切り替えが可能となります。デフォルトでは `ctrl + b` になっています。


## 起動して新規セッションを作成する

 DebianやUbuntuならば、`sudo apt-get install tmux`  でインストールできます。MacOSXならば `brew install tmux` です。
 
 ただ起動するだけならば、引数なしでOKです。

```console
$ tmux
```

セッションに名前をつける際は、以下のようなオプションで起動します。

```console
$ tmux new -s {新規セッション名}
````

![新規セッションの作成.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87692/87720b91-7d86-b8b5-da9d-03334d38946e.gif)


## windowを新規作成する

tmuxのセッションの中にいる状態で、`ctrl + b` + `c` と入力すると新規にwindowを作成できます。prefixで置き換えた表記では、`prefix + c` です。おそらく、このcの意味は createだろうと思われます。

![新規windowの作成.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87692/e1b37107-0efc-8e76-883b-d4205e7cd11a.gif)



## window間を行き来する

作成したwindowの間は自由に行き来することができ、デフォルトでは、`prefix + p` で前のwindowへ（pはprevious）、`prefix + n` で次のwindowへ(nはnext)となります。

prefixは押すコストが大きいので、私はprefixを押さないでも発動するようにキーバインドをカスタマイズしており、`shift + rightKey` で次のwindow, `shift + leftKey` で前のwindowに割り当てています。

![別のwindowへ切り替え.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87692/b5b8a1b2-ea86-280b-8afb-5bed89c10926.gif)


## windowを分割してpaneを作成する

vimの分割のようにwindowを分割でき、かつvimのようにテキストエディタの世界に閉じないものなので、一方でvimを開き、一方でhtopを開き、一方でプログラムを実行するなど、広いterminalの利用を行うことができます。

キーバインド設定等なしでは、 `prefix + "split-window -h"`, `prefix + "split-window -v"` などとして分割できます。

これも入力するのが大変なので、 `prefix + "-"`, `prefix + "|"` にキーバインドして操作しやすくしています。

![windowをpaneに分割.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87692/693e27f1-ed8e-8bfd-1ab7-5076de16254d.gif)


## paneを行き来する

デフォルトでは、paneの移動はprefixコマンドを挟む、複雑なキーバイドですが、こちらもprefixなしで定義することができます。

私は、`ctrl + shift + upKey`, `ctrl + shift + downKey`, `ctrl + shift + rightKey` , `ctrl + shift + leftKey` をpaneの移動に割り当てており、prefixを経由しなくてもpane間の移動が可能になっています。
![paneの切り替え.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87692/edeedf08-c715-7ebf-a292-b1e956f8f511.gif)


## セッション間を行き来する

`ctrl + t` にセッションの選択一覧を表示するキーバインドを割り当てており、このキーを押すと、下図のようなセッション一覧を見ることが可能になります。

上下キーで選択可能で、選ぶとそのキーに移動できます。  

![別のセッションへ切り替え.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87692/83d2f5e7-37e3-73b1-2445-96c4757e2c51.gif)




##【応用】tmuxの表示内容をリダイレクトする

tmuxは `/dev/pts/{fooBar}` のような仮想ターミナルで、paneごとにこの仮想デバイスが作成されます。
つまり、`{fooBar}` が特定できれば、あるpane Xの内容を stderr, stdoutなどに分けて、pane Y, pane Zにそれぞれ表示することができます。

作成したプログラムなどが、stderrとstdoutなどと分けてログを確認したい場合や、仮想ターミナルに読み書きもできるので、操作ログなどの証跡を残すことも可能になります。

![](https://paper-attachments.dropbox.com/s_6637B48CF5550ED525F155F5B19C27AB7BA4B8C13012DF039456ECC14D86F184_1595153788056_stdout_stderr.gif)



## 【応用】tmuxのバーにgitのbranch名を表示する

これは、tmuxの設定ファイルである、`.tmux.conf` からシェルスクリプトやpythonスクリプトを読み出せることを利用したハックです。

statusバーの通知は以下のような構文で定義可能です。　

```
set-option -g status-right '#{host} #(tmux run-shell "tmux_hook --default true --git-path #{pane_current_path}")'  
```

`#{host}` はそのままホスト名なのですが、`tmux run-shell` は任意のスクリプトを動作させ、その戻り値をステータスバーの設定に与えるものになっています。  
`tmux_hook` というファイル名が私が作成したスクリプトで、時間とgitのbranch名などを返すものになっていますが、どんなテキスト情報でも返せるので、例えばスクリプトの組み方によっては自分のtwitterのtimelineでも表示可能です。

![Screenshot_20200719_194105.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87692/ee5c904c-fdfc-55bf-1697-68851531d12e.png)




##【応用】現在の操作パスを表示する

今どのディレクトリにいてどのパスにいるかはterminalでいじくり回しているときに結構確認したい事柄です。
そのたびに、pwdコマンドなどを打ちたくないので、paneの分割する境界線の場所にも情報を表示することが可能です。 

```
setw -g pane-border-format '#{pane_tty} | #{pane_current_path}'
```
![Screenshot_20200719_203450.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87692/35d63db5-818a-857b-8392-46ac30aae669.png)
(右側が今操作しているパスになります)

##【応用】スニペットを呼び出す
tmuxというターミナルを分割する機能のあるセッションマネージャなのにIDEみたいなことができるんです（すごい）。tmuxには `send-keys` という設定をすることができ、特定のキーの組み合わせを入力することで、予約された文字をterminalに入力することができます。

例えば、以下の設定があると、pythonのセットアップのようなことを `prefix + 1` を押すだけで実現できて、これを応用すると競プロなどでも利用可能であろうと思われます。

```
bind -T prefix -n 1 send-keys "import os\nimport sys\n"
```

![スニペットを登録する.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87692/ed6a212d-6274-e8a8-b1a2-88b7842c9c4e.gif)

## 以上の設定の `.tmux.conf` はこちら 

- https://bitbucket.org/nardtree/gimpei-dot-files/src/master/files/tmux.conf


## tmuxはバージョン互換性がかなり微妙

ネット上の文献等をみて設定したのに動かない、ということはかなりあり、その場合、自分のtmuxが新しすぎるか、古すぎることがあります。
今回はtmux 2.8以上を期待したconfigの書き方でしたが、動かないなどの際はご自身の環境をチェックしてみてください。
ご自身でデバッグする方法として、今ある書き方が変わった場合、`man tmux` が今の所最もしっかりしたドキュメントなので一読いただくと良いでしょう。


## YouTubeでも投稿してみました

 めちゃくちゃ恥ずかしいんですが、会話の練習や表現方法の研究のために、やっています。tmuxの使い勝手を動画形式で見てみたい方は、以下のURLからご参照ください。
 チャンネル登録していただけると幸いです。

- https://youtu.be/Rr9-pUCXn6A