49
46

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

49
46
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
49
46

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?