ターミナルをかっこよくカスタマイズしたいためだけにtmuxデビューしてみた


Homebrewを使ってインストールしていきます。
Homebrewのインストールには以下を参考。
[MacにHomebrewをインストールする](https://qiita.com/_daisuke/items/d3b2477d15ed2611a058)


難しいことは割愛して、とりあえずtmuxを起動して、良い感じにカスタマイズしたとこまでを書きます
iTermだと元々画面分割ができますが、tmuxを使うと、枠線に色をつけれたり、アクティブな枠(pane)は別色に出来たりするのでiTermだけよりはイイカンジになります

#環境
Mac      : 10.11.5（OS X El Capitan)
iTerm2   : 3.1.3
zsh      : 5.0.8
Homebrew : 1.3.5


#インストールしたtmuxのバージョン
tmux : 2.6


#tmuxとは

>tmuxは端末多重化ソフトウェアである。
	これを使うことでターミナルを複数開くことなく、プログラムを走らせたり出来るし、ペインを使うことで作業の効率化が計れる。
	(iterm2だとそこまで複数のターミナルを開くことは辛くないんだが、たぶんまだわかっていない利点があるのだろう。)
	tmuxはバックグラウンドでも働くので、ネットワークが切れても再開可能なのが一番の利点かな。もしくはやりたいことごとに使い分けが可能か。
	サーバーに入れておくと一つのssh接続で複数の端末が扱えれるし切断しても大丈夫。
	
>tmuxを使うことによるメリット  
	1つの端末で複数の擬似端末を起動可能  
	複数の端末を立ち上げずに、tmux上の擬似端末を切り替えてオペレーション可能  
	起動した仮想端末を画面分割して使用可能  
	他のファイルを参照したりログ出力を参照しながらオペレーション可能  
	起動した仮想端末上でコピペが可能  
	マウスを使わず、tmux内でキーボードのみでのコピペが可能  
	起動した仮想端末のデタッチ(切り離し)/アタッチ(接続)が可能  
	tmux実行端末とのネットワークが切れても問題なく、異なる環境から同じtmuxセッションへ接続可能  
	
[tmuxの使い方 #tmuxの概要](https://qiita.com/vintersnow/items/be4b29652ff665c45198#tmuxの概要)

自分はたまにSSHつかって仮想で作業する程度なので、正直そこまでtmuxをつかうことでメリットが恩恵を得ることはないかもしれないけども

 - tmux実行端末とのネットワークが切れても問題なく、異なる環境から同じtmuxセッションへ接続可能

というのはなかなか便利だなって思います

#session,window,pane
こちらも先人の方で分かりやすく図で説明している記事がありますので、そちらを

[vim流tmuxチュートリアル #tmuxの概要](https://qiita.com/saino-katsutoshi/items/b7e04182e1dd8cb3bbd6#tmuxの概要)

#関連リンク
ドットインストールにもある(無料会員だと殆ど見れない)
[tmux入門](https://dotinstall.com/lessons/basic_tmux)

#本題
##tmuxをインストール

```
$brew install tmux

Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> Updated Formulae
passenger

==> Installing dependencies for tmux: libevent
==> Installing tmux dependency: libevent
==> Downloading https://homebrew.bintray.com/bottles/libevent-2.1.8.el_capitan.bottle.tar.gz
######################################################################## 100.0%
==> Pouring libevent-2.1.8.el_capitan.bottle.tar.gz
🍺  /usr/local/Cellar/libevent/2.1.8: 847 files, 2.2MB
==> Installing tmux
==> Downloading https://homebrew.bintray.com/bottles/tmux-2.6.el_capitan.bottle.tar.gz
######################################################################## 100.0%
==> Pouring tmux-2.6.el_capitan.bottle.tar.gz
==> Caveats
Example configuration has been installed to:
  /usr/local/opt/tmux/share/tmux

Bash completion has been installed to:
  /usr/local/etc/bash_completion.d
==> Summary
🍺  /usr/local/Cellar/tmux/2.6: 10 files, 692.5KB
```

##バージョンの確認
```
$tmux -V
tmux 2.6
```

インストール作業はこれだけです！簡単！


##設定ファイル
ホームディレクトリに設定ファイルを作成します

```
touch ~/.tmux.conf
```
で、設定ファイルの中身なのですが、とりあえずさっさと良い感じにしたい、場合は先人の方々が設定ファイルを公開しているので参考にすると良いと思います
(ただ、中には今は適用されない設定や書き方が統一されていない場合があるのでその辺は後述します)

例えば
[達人に学ぶ.tmux.confの基本設定](https://qiita.com/succi0303/items/cb396704493476373edf)
等

##とりあえずtmux体験をしてみる
![スクリーンショット 2017-10-18 15.29.45.png](https://qiita-image-store.s3.amazonaws.com/0/72559/ad92cb52-2204-2de2-f6d5-fdc01e8a50cf.png "スクリーンショット 2017-10-18 15.29.45.png")

###設定の確認
####記述の違い
複数人の方の設定ファイルを見ていると、`bind`と書いてたり`bind-key`と書いてあったりばらつきがあるのですが、

>だいたいはエイリアス。
	上ではさらっと使ったけど、bindとかはエイリアス。設定ファイルでよく使うものはだいたい以下。


| command | alias |
|:-----------|------------:|
| bind-key       |       bind |
| unbind-key     |      unbind | 
| set-option       |        set | 
| set-window-option         |          setw | 

参考URL
[tmuxと仲良くなる](http://takasing104.hateblo.jp/entry/2014/08/05/194923)
(とても分かりやすくて感謝！)

とのことなので、エイリアスに統一した方が良いかもしれません。

###shellの設定
もしzsh等を使っている方でデフォルトshellをzshにしてなかったり
コピーしてきた設定ファイルがBashになってるかもしれないので一応確認しましょう
`.tmux.conf`を開き

```
# Homebrewでいれたzshの場合
set -g default-shell   /usr/local/bin/zsh
set -g default-command /usr/local/bin/zsh

# Macに元々入ってるzshの場合
set -g default-shell   /bin/zsh
set -g default-command /bin/zsh

# Bashの場合
set -g default-shell   /bin/bash
set -g default-command /bin/bash
```

###prefixの設定
tmuxを扱う際に割と重要なので先に説明と設定の確認を行います

tmuxでコマンドを打つ際にまず2つのコマンドを入力した後に
更にキーを入力します

デフォルトとしてはprefixとして　`ctrl + b`が設定されています。
prefixは設定が変更可能であり`.tmux.conf`で

```
unbind C-b
set -g prefix C-z
bind C-z send-prefix
```
(-gをつけると全セッションに対してグローバルな設定になるらしい)
このような書き方をすると `ctrl + z`がprefixとなる
Ctrl-bはemacsのキーバインドと被るので他に変更したって方も多いようです
この辺は環境や好みに合わせて下さい。

ですので、以下のような設定の場合

```
bind - split-window -v
bind | split-window -h
```

`Ctrlキー` と`zキー`を入力したあとに、`-`を入力すると画面が水平分割でき、
`Ctrlキー` と`zキー`を入力したあとに、(US keyboardなmacの場合)`shiht`と`\`を入力すると画面が垂直分割できます。
(個人的に上記の割り当ての方が視覚的にも分りやすい気がする)

因みに`Ctrlキー` と`zキー`つまりprefixは一度同時に入力したあと、指を離してから次のコマンドを入力して下さい。

###廃止されたオプション
####mouse系
`tmux 2.1`から`mouse`系のオプションに変更があり、1つに纏められたようです。
なので、古い設定ファイルを使用した場合、tmuxを起動時、それらを記述してあった場合警告がでると思います。

>Incompatible Changes
	====================
	* Mouse-mode has been rewritten.  There's now no longer options for:
	    - mouse-resize-pane
	    - mouse-select-pane
	    - mouse-select-window
	    - mode-mouse
	  Instead there is just one option:  'mouse' which turns on mouse support
	  entirely.

[https://raw.githubusercontent.com/tmux/tmux/master/CHANGES](https://raw.githubusercontent.com/tmux/tmux/master/CHANGES)

ですので、これらの警告を消すためには上記の対象となる記述を削除し、
以下の記述を追加することで代わりになります。

```
set-option -g mouse on
```

####UTF8の設定
また、`tmux 2.2`から

>* UTF8 detection how happens automatically if the client supports it, hence
	  the:
	  mouse-utf8
	  utf8
	  options has been removed.

と明示的なUTF8の設定が不要になったらしいので、れらの警告を消すためには上記の対象となる記述を削除します。

#はじめてのtmuxチュートリアル
長くなりましたが一応大事な設定の部分だけ説明しました。
ではチュートリアルを始めようと思います。

##設定の確認
また設定かよってなるかもしれませんが、同じ動きになるように
設定を合わせて置こうと思います。
以下の設定を`.tmux.conf`の一番下等に記述して下さい。

```
# prefixの変更
unbind C-b
set -g prefix C-z
bind C-z send-prefix

# mouse操作を可能に
set -g mouse               ON

# Pre - で縦分割
# Pre | で横分割
unbind %
unbind '"'
bind - split-window -v
bind | split-window -h
```

##セッション一覧の確認
まずセッションを確認します。

```
$ tmux ls
```
まだセッションを作っていないので以下のようになると思います。
(シェルを少し弄ってるので、画面は微妙に違うと思います)

![スクリーンショット 2017-10-18 17.32.27.png](https://qiita-image-store.s3.amazonaws.com/0/72559/a55585d2-a0f8-7139-4173-fa4943855d7c.png "スクリーンショット 2017-10-18 17.32.27.png")

##tmux起動(セッションの作成)
この操作は`セッションを新しく開始する`ことです
(今は分からなくてもだんだんなんとなく分かります、きっと)

```
$tmux
```

セッションに名前をつけるときは

```
$tmux new -s セッション名
```
とりあえず折角なので適当に名前をつけてみると良いかもしれません。
![スクリーンショット 2017-10-18 17.35.15.png](https://qiita-image-store.s3.amazonaws.com/0/72559/af7be82c-0ec9-666d-301d-cb6f4e387a0b.png "スクリーンショット 2017-10-18 17.35.15.png")

上記を叩くと
![スクリーンショット 2017-10-18 17.35.49.png](https://qiita-image-store.s3.amazonaws.com/0/72559/8979a1b8-c467-a6b5-5d15-8dbeb052421f.png "スクリーンショット 2017-10-18 17.35.49.png")

画面が切り替わり、
`tmuxの起動`と`アタッチしている`状態になります。
(これまた、設定ファイルを弄っているので画面の表示は異なると思います。設定内容は後述します。)

##適当に何か入力する
とりあえず、適当にechoでもします。理由は後から分かります。

```
$ echo "Hello,tmux"
```
![スクリーンショット 2017-10-18 17.53.29.png](https://qiita-image-store.s3.amazonaws.com/0/72559/cddda349-f3cc-e70a-a325-6fe87b2261b3.png "スクリーンショット 2017-10-18 17.53.29.png")

##デタッチする
今ターミナルと接続しているセッションから切り離します。
デタッチするには  `prefix , d`
つまり、`Ctrlキー` と`zキー`を入力した後に　`d` を叩きます。

![スクリーンショット 2017-10-18 17.54.22.png](https://qiita-image-store.s3.amazonaws.com/0/72559/659c74a1-3860-c4d4-bbdd-87aa849bc917.png "スクリーンショット 2017-10-18 17.54.22.png")
こんな感じで元の画面に戻ってきます。

##再度セッション一覧の確認
再びセッション一覧を確認します。

```
$ tmux ls
```
すると今度は先ほどの作成したセッション名が表示されます。
つまりデタッチしてもセッション自体は残っているということです。
![スクリーンショット 2017-10-18 17.57.02.png](https://qiita-image-store.s3.amazonaws.com/0/72559/ca116b39-4176-d1d8-cccc-bfe9cffe92fe.png "スクリーンショット 2017-10-18 17.57.02.png")

##一度ターミナルを閉じてもう一度開いてみる
一度ターミナルを開いて、もう一度 `$ tmux ls`をしてみて下さい。
セッションが残っている事が確認できます。
![スクリーンショット 2017-10-18 18.15.30.png](https://qiita-image-store.s3.amazonaws.com/0/72559/3580314f-5d81-281e-6c0b-7ff58726926f.png "スクリーンショット 2017-10-18 18.15.30.png")

##別のターミナルから一覧を見てみる
今まで開いていたターミナルとは別のターミナルで `$ tmux ls`
同じセッションが表示されていることが確認できます
![スクリーンショット 2017-10-18 18.17.54.png](https://qiita-image-store.s3.amazonaws.com/0/72559/eff70fed-33b6-fb7d-6aa7-329d2bd54e97.png "スクリーンショット 2017-10-18 18.17.54.png")

##アタッチする
最初に使っていたターミナルから
デタッチしたセッションを再度繋ぎ直します。
これをアタッチと言います。

```
$tmux attach
($tmux a でも可)
```

セッションを指定してのアタッチもできます

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

折角なのでセッション名を指定します。
コマンドラインにセッション名の記述が残っていると思うのでそれを参考にして下さい。

![スクリーンショット 2017-10-18 18.29.28.png](https://qiita-image-store.s3.amazonaws.com/0/72559/26d94c8a-a3cf-fb7e-d769-a027f3a4edc3.png "スクリーンショット 2017-10-18 18.29.28.png")


上記を叩くと

![スクリーンショット 2017-10-18 18.04.10.png](https://qiita-image-store.s3.amazonaws.com/0/72559/d073aaf3-fda6-25ed-527e-a0c70251dae7.png "スクリーンショット 2017-10-18 18.04.10.png")
このように先ほどの操作が残ったままになっている事が分かると思います。

##画面(pane)分割
では、画面分割です。
先ほど設定を記述して頂いたので
まず、

`Ctrlキー` と`zキー`を入力したあとに、`-`を入力します
画面が水平分割されます
![スクリーンショット 2017-10-18 18.57.26.png](https://qiita-image-store.s3.amazonaws.com/0/72559/f7603147-61a7-a3d6-22ec-f9252d05551a.png "スクリーンショット 2017-10-18 18.57.26.png")

次に`Ctrlキー` と`zキー`を入力したあとに、(US keyboardなmacの場合)`shiht`と`\`を入力します
画面が垂直分割されます。
![スクリーンショット 2017-10-18 18.57.43.png](https://qiita-image-store.s3.amazonaws.com/0/72559/c3abcd4b-05af-ce46-7313-b37a814c132f.png "スクリーンショット 2017-10-18 18.57.43.png")

因みにこれらは`Pane(ペイン)`と呼ばれます。

##Paneの移動
`set -g mouse  ON`にしているのでクリックで移動できるのですが、
`prefix,o`で順移動ができます・

##Paneの削除
選択中のPaneを削除するには`prefix,x`でを叩くと
`kill-pane <pane番号>? y/n`と表示されるので`y`を叩きます
![スクリーンショット 2017-10-18 19.08.01.png](https://qiita-image-store.s3.amazonaws.com/0/72559/bb4309c6-8760-90ab-de2a-2f4543f09786.png "スクリーンショット 2017-10-18 19.08.01.png")

他にもPaneを上下入れ替えたりできますが割愛
(以下とか参考になります)
[tmuxチートシート](https://qiita.com/nmrmsys/items/03f97f5eabec18a3a18b)

##セッションの削除
一度デタッチします。
(`Ctrlキー` と`zキー`を入力後に　`d` を叩く)

一度 `$tmux ls`でセッション一覧を確認してみる
![スクリーンショット 2017-10-18 19.16.11.png](https://qiita-image-store.s3.amazonaws.com/0/72559/f4fe2f94-89d5-381b-9b2d-7ebd0e6f17b3.png "スクリーンショット 2017-10-18 19.16.11.png")

セッションが残っていることが確認できたら

```
$ tmux kill-server
```
で、tmuxのプロセスを落とすことも可能ですし

```
$ tmux kill-session -t 削除するセッション名
```
で、セッション名を指定して削除することも可能です

ではセッション名を指定して削除をします。

削除のコマンドを叩いた後にもう一度 `$tmux ls`でセッション一覧を確認してみましょう。
![スクリーンショット 2017-10-18 19.25.38.png](https://qiita-image-store.s3.amazonaws.com/0/72559/02e02ca9-064a-35cb-7c55-af2d20e175c7.png "スクリーンショット 2017-10-18 19.25.38.png")

`no server running`となっていれば完了です。

#画面のカスタマイズ
##ステータスバー(status line)の設定
status lineの設定に関しては以下の記事がとても参考になりました。
[tmux の status line の設定方法](https://qiita.com/nojima/items/9bc576c922da3604a72b)

色の指定は`color(アメリカ綴り)`ではなく`colour(イギリス綴り)`なので注意

因みに私は

```
# 描画更新間隔秒。デフォルトは15秒
# 右パネルで時間を秒まで出しているので1秒に設定しました
set -g status-interval 1

# 全体
set -g status-fg "colour255"
set -g status-bg "colour238"

## ステータスバーを上部に表示する
set -g status-position bottom

# 左パネル
#'#S'はセッション名
set -g status-left-length 60
set -g status-left-fg "colour255"
set -g status-left-bg "colour201"
set -g status-left "Session: #S"

#中央
## ウィンドウリストの位置を中心寄せにする
set -g status-justify "centre"

## window-status のフォーマットを指定する。
## '#I'はカレントウィンドウのインデックス、'#W'はカレントウィンドウ名
set-window-option -g window-status-format " #I: #W "

## カレントウィンドウwindow-status のフォーマットを指定する
set-window-option -g window-status-current-format "#[fg=colour255,bg=colour27,bold] #I: #W"

# 右パネル
# ' #h'はホスト名、'%m/%d %H:%M:%S'は月/日 時:分:秒
set -g status-right-length 60
set -g status-right-bg cyan
set -g status-right-fg black
set -g status-right "#h | %m/%d %H:%M:%S"
```
上記の設定でこんな感じになります
![スクリーンショット_2017-10-19_10_08_06.png](https://qiita-image-store.s3.amazonaws.com/0/72559/471094d6-3a18-a60e-7b38-b4338cef1829.png "スクリーンショット_2017-10-19_10_08_06.png")

詳しいことは先ほどのURLに書いているのでそちらを見て頂きたいのですが
formatの書き方として

個別に書く方法と

```
set -g status-right-bg cyan
set -g status-right-fg black
set -g status-right "#h | %m/%d %H:%M:%S"
```

纏めて書く方法があります

```
set-option -g status-right "#[fg= cyan,bg= black] #h | %m/%d %H:%M:%S[default]"
```

`[default]`を書くと属性がリセットされるようです。

以下を参考
[attributes に指定できる文字列](https://qiita.com/nojima/items/9bc576c922da3604a72b#attributes-%E3%81%AB%E6%8C%87%E5%AE%9A%E3%81%A7%E3%81%8D%E3%82%8B%E6%96%87%E5%AD%97%E5%88%97)

##Paneの枠線
自分の場合

```
# Paneの文字色
set  -g pane-border-fg           colour232
# Paneの背景色
set  -g pane-border-bg           colour45

# アクティブPaneの文字色
set  -g pane-active-border-fg    colour164
# アクティブ Paneの背景色
set  -g pane-active-border-bg    colour47
```
のように設定しており、以下のような感じになってます。
![スクリーンショット 2017-10-19 11.02.57.png](https://qiita-image-store.s3.amazonaws.com/0/72559/bb12d3cd-3bfb-b3d3-de28-1bd8d030d9a4.png "スクリーンショット 2017-10-19 11.02.57.png")

#ターミナル中の文字がコピーができない問題
通常コピー方法
[vim流tmuxチュートリアル #コピー](https://qiita.com/saino-katsutoshi/items/b7e04182e1dd8cb3bbd6#コピー)

##範囲指定ができない
iTermだとマウスで範囲指定をしてコピーができない時があるようです
(自分はできたりできなかったりした)

原因としてマウス機能がONになっていると上手くいかないようです
解決方法として、以下の記事にて`必要に応じてマウス機能をON/OFF切り替える`方法が紹介されています
[tmux+iTerm2でマウス(タッチパッド)利用時にマウスによるコピペができない問題の対処](https://qiita.com/u1tnk/items/9a680d16065217015e16)
ですが、少しコードが古いので([廃止されたオプション参照](https://qiita.com/Frog_woman/items/f6797f2a70c44e42863d#mouse系))以下のように書き直しました。

```
bind m \
    set -g mouse          on \; \
    display "Mouse: ON"
bind M \
    set -g mouse          off \; \
    display "Mouse: OFF"
```

これで`prefix,m`や`prefix,M`で切り替えて対処するしかなさそうです。

また、自分が出来た方法として
コピーしたい範囲の先頭から後尾までしっかりとマウスで範囲指定するとコピーできました。
ちゃんと範囲指定できると後尾がグレーに表示されてました。
![スクリーンショット 2017-11-13 9.47.16.png](https://qiita-image-store.s3.amazonaws.com/0/72559/7b1445b3-0386-ae77-78f5-14c93b6abb98.png "スクリーンショット 2017-11-13 9.47.16.png")
またファイル名だけコピーしたい場合はダブルクリックで出来ました
![スクリーンショット 2017-11-13 9.48.31.png](https://qiita-image-store.s3.amazonaws.com/0/72559/7124250e-2b49-82d0-548a-6e9c9e1d90ae.png "スクリーンショット 2017-11-13 9.48.31.png")

##別のwindowまでコピー範囲に含まれてしまう
[tmuxのコピーモードを使わずに任意の範囲選択をする](https://qiita.com/mogulla3/items/ca5bfa585ef19ed1eb9b)

#設定ファイル(.tmux.conf)の再読み込み

```
$ tmux source-file ~/.tmux.conf
```

で可能らしいのですが、

>設定の種類や順序によっては、うまくいかなくなるパターンもあります

とのことで、以下の方法でtmuxのプロセスを落とす方が確実のようです

```
$ tmux kill-server
```

参考URL
[それゆけ！ターミナル部 第11回
tmuxをカスタマイズして使いやすくしよう！](https://mynavi-agent.jp/it/geekroid/2017/03/-11tmux.html)

#設定ファイルでのオプション
## -r とか -gとか
あまりよく分かってないので間違いなどありましたら指摘して頂けると助かります

| オプション | 意味 |
|:-----------:|:------------:|
| -g       |       全セッションに対してグローバルな設定になる |
| -n     |      tmuxのPrefixキーをタイプする必要がなくなる | 
| -t      |        コピーモードでのキーバインドを指定 | 

>コピーモードになってから y キーをタイプするとカーソルがある1行がコピーされる設定です。

```
bind -t vi-copy y copy-line
```



>tmuxのPrefixキー無しに、Ctrl-p だけで直近にコピーされたbufferをペーストします。 （私は、Ctrl-pが他のvimバインドとバッティングしているので bind p paste-buffer として使っています。）

```
bind -n C-p paste-buffer
```

参考URL
[tmuxコピーモードのキーバインドを簡単なキーに変更してみた](http://engineerspirit.com/2017/01/29/post-726/)


#便利コマンド
##一時的にpaneを拡大したい
`resize-pane -Z`で一時的に拡大することができます。

デフォルトコマンドは`prefix,z`で選択中のpaneをターミナル全体に拡大できます。
元に戻す場合はもう一度同じコマンドを。
拡大した上でpaneを分割しても、拡大する前の状態から分割されます。

参考URL
[tmux で 一時拡大の resize-pane -Z が便利。(ver1.8以降)](https://qiita.com/kou-arw/items/297a1f2c4ec97ff48afd)



---


何か間違いなどありましたら、コメントなど下さると有難いです
まだtmuxを始めたばかりなので、他に気づいたことなどが出てきたら更新していこうと思います。