LoginSignup
48
45

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-10-19

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を始めたばかりなので、他に気づいたことなどが出てきたら更新していこうと思います。

48
45
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
48
45