tmux

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

More than 1 year has passed since last update.

Homebrewを使ってインストールしていきます。

Homebrewのインストールには以下を参考。

MacにHomebrewをインストールする

難しいことは割愛して、とりあえず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の概要

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


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

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


session,window,pane

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

vim流tmuxチュートリアル #tmuxの概要


関連リンク

ドットインストールにもある(無料会員だと殆ど見れない)

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の基本設定


とりあえずtmux体験をしてみる

スクリーンショット 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と仲良くなる

(とても分かりやすくて感謝!)

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


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

ですので、これらの警告を消すためには上記の対象となる記述を削除し、

以下の記述を追加することで代わりになります。

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


tmux起動(セッションの作成)

この操作はセッションを新しく開始することです

(今は分からなくてもだんだんなんとなく分かります、きっと)

$tmux

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

$tmux new -s セッション名

とりあえず折角なので適当に名前をつけてみると良いかもしれません。

スクリーンショット 2017-10-18 17.35.15.png

上記を叩くと

スクリーンショット 2017-10-18 17.35.49.png

画面が切り替わり、

tmuxの起動アタッチしている状態になります。

(これまた、設定ファイルを弄っているので画面の表示は異なると思います。設定内容は後述します。)


適当に何か入力する

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

$ echo "Hello,tmux"

スクリーンショット 2017-10-18 17.53.29.png


デタッチする

今ターミナルと接続しているセッションから切り離します。

デタッチするには prefix , d

つまり、Ctrlキーzキーを入力した後に d を叩きます。

スクリーンショット 2017-10-18 17.54.22.png

こんな感じで元の画面に戻ってきます。


再度セッション一覧の確認

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

$ tmux ls

すると今度は先ほどの作成したセッション名が表示されます。

つまりデタッチしてもセッション自体は残っているということです。

スクリーンショット 2017-10-18 17.57.02.png


一度ターミナルを閉じてもう一度開いてみる

一度ターミナルを開いて、もう一度 $ tmux lsをしてみて下さい。

セッションが残っている事が確認できます。

スクリーンショット 2017-10-18 18.15.30.png


別のターミナルから一覧を見てみる

今まで開いていたターミナルとは別のターミナルで $ tmux ls

同じセッションが表示されていることが確認できます

スクリーンショット 2017-10-18 18.17.54.png


アタッチする

最初に使っていたターミナルから

デタッチしたセッションを再度繋ぎ直します。

これをアタッチと言います。

$tmux attach

($tmux a でも可)

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

$ tmux attach -t セッション名

折角なのでセッション名を指定します。

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

スクリーンショット 2017-10-18 18.29.28.png

上記を叩くと

スクリーンショット 2017-10-18 18.04.10.png

このように先ほどの操作が残ったままになっている事が分かると思います。


画面(pane)分割

では、画面分割です。

先ほど設定を記述して頂いたので

まず、

Ctrlキーzキーを入力したあとに、-を入力します

画面が水平分割されます

スクリーンショット 2017-10-18 18.57.26.png

次にCtrlキーzキーを入力したあとに、(US keyboardなmacの場合)shiht\を入力します

画面が垂直分割されます。

スクリーンショット 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

他にもPaneを上下入れ替えたりできますが割愛

(以下とか参考になります)

tmuxチートシート


セッションの削除

一度デタッチします。

(Ctrlキーzキーを入力後に d を叩く)

一度 $tmux lsでセッション一覧を確認してみる

スクリーンショット 2017-10-18 19.16.11.png

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

$ tmux kill-server

で、tmuxのプロセスを落とすことも可能ですし

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

で、セッション名を指定して削除することも可能です

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

削除のコマンドを叩いた後にもう一度 $tmux lsでセッション一覧を確認してみましょう。

スクリーンショット 2017-10-18 19.25.38.png

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


画面のカスタマイズ


ステータスバー(status line)の設定

status lineの設定に関しては以下の記事がとても参考になりました。

tmux の status line の設定方法

色の指定は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

詳しいことは先ほどの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 に指定できる文字列


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


ターミナル中の文字がコピーができない問題

通常コピー方法

vim流tmuxチュートリアル #コピー


範囲指定ができない

iTermだとマウスで範囲指定をしてコピーができない時があるようです

(自分はできたりできなかったりした)

原因としてマウス機能がONになっていると上手くいかないようです

解決方法として、以下の記事にて必要に応じてマウス機能をON/OFF切り替える方法が紹介されています

tmux+iTerm2でマウス(タッチパッド)利用時にマウスによるコピペができない問題の対処

ですが、少しコードが古いので(廃止されたオプション参照)以下のように書き直しました。

bind m \

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

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

また、自分が出来た方法として

コピーしたい範囲の先頭から後尾までしっかりとマウスで範囲指定するとコピーできました。

ちゃんと範囲指定できると後尾がグレーに表示されてました。

スクリーンショット 2017-11-13 9.47.16.png

またファイル名だけコピーしたい場合はダブルクリックで出来ました

スクリーンショット 2017-11-13 9.48.31.png


別のwindowまでコピー範囲に含まれてしまう

tmuxのコピーモードを使わずに任意の範囲選択をする


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

$ tmux source-file ~/.tmux.conf

で可能らしいのですが、


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


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

$ tmux kill-server

参考URL

それゆけ!ターミナル部 第11回

tmuxをカスタマイズして使いやすくしよう!


設定ファイルでのオプション


-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コピーモードのキーバインドを簡単なキーに変更してみた


便利コマンド


一時的にpaneを拡大したい

resize-pane -Zで一時的に拡大することができます。

デフォルトコマンドはprefix,zで選択中のpaneをターミナル全体に拡大できます。

元に戻す場合はもう一度同じコマンドを。

拡大した上でpaneを分割しても、拡大する前の状態から分割されます。

参考URL

tmux で 一時拡大の resize-pane -Z が便利。(ver1.8以降)


何か間違いなどありましたら、コメントなど下さると有難いです

まだtmuxを始めたばかりなので、他に気づいたことなどが出てきたら更新していこうと思います。