極楽とんぼのロボット製作記

情報工学系大学院生がロボットとその周辺技術や身の回りの出来事について紹介するブログ

複数のターミナルを同時に起動・分割ができるターミナルマルチプレクサ「tmux」を使ってみる


以前はTerminatorというソフトを使っていましたが、tmuxに比べてあまりにも機能が貧弱であったため、こちらに乗り換えました。

使用環境
OS: Ubuntu GNOME 16.04
tmux: 2.1

tmuxの何がうれしいか

ターミナルの分割ができる

画像のようにターミナルを分割して、1つの画面で複数のコマンドを実行します。ROSで複数のノードを立ち上げる時などに重宝します。
f:id:gokuraku104robot:20180130202713p:plain:w500

セッションの保存

せっかく分けたペイン(上で言う分割されたターミナルのこと)が起動の度にリセットされてしまうのはもったいないですよね。tmuxでは下の動画のようにウィンドウ(タブのようなもの)やペイン、セッションなどを保存してロードすることができます。
(tmux-resurrectを使用)
Prefix + Ctrl+s でセッションを保存し、Prefix + Ctrl+rでセッションのロードができます。
f:id:gokuraku104robot:20180131115058g:plain:w500

コピーモードが使える

コマンドの出力結果などをコピーする際に、マウスなどでドラッグしていませんか?tmuxならvimのヴィジュアルモードのようにコマンドの出力結果をクリップボードにコピーしたり、コマンドラインに貼り付けて実行させたりできます。エラーメッセージなどをググる時も便利です。
f:id:gokuraku104robot:20180131195920p:plain:w500

インストール

インストールするには以下のようにします。

$ sudo apt install tmux

tmuxの基本要素

tmuxを理解する上で、Session、Window、Paneの3要素を覚える必要があります。
Paneはターミナルを分割している単位
Windowは複数のPaneを束ねるタブ(のようなもの)
Sessionは複数のWindowを束ねているもの
です。
下が実際のWindowとPaneです。

f:id:gokuraku104robot:20180131202510p:plain:w500
実際のWindowとPane

SessionはPrefix + sやtmux ls等のコマンドを打つとわかります。

f:id:gokuraku104robot:20180131202813p:plain:w500
Session(Prefix + sでの表示)

基本的な操作

まずはtmuxの基本操作からです。赤字以外のPrefixを伴う操作は後で便利なキーバインドに変えるので覚える必要はありません。ここではtmuxでどんな操作ができるのかデフォルトのキーバインドでは非常に使いづらいことを感じていただければOKです。

Prefix + ? (PrefixはデフォルトではCtrl-b)
でヘルプを見ることができます。

セッションの操作

tmuxの起動

$ tmux

新しいセッションで起動
Prefix + dでセッションをデタッチして新しいセッションでtmuxを起動してみましょう。

$ tmux new-session

セッションの確認

$ tmux ls
0: 1 windows (created Thu Jan 11 15:34:44 2018) [158x41]
1: 1 windows (created Thu Jan 11 15:39:35 2018) [158x41]

セッションのデタッチ
Prefix + d

セッションのアタッチ

$ tmux attach #直前のセッションをアタッチ
$ tmux attach -t 0 #任意のセッション番号のセッションをアタッチ
$ tmux attach -t hoge #任意のセッション名のセッションをアタッチ

別のセッションへ移動
Prefix + s

セッションの削除

$ tmux kill-session -t 0 #任意のセッション番号のセッションを削除
$ tmux kill-server #すべてのセッションを削除

ウィンドウの操作

新規ウィンドウの作成
Prefix + c

ウィンドウの切り替え
Prefix + ウィンドウ番号 :ウィンドウ番号のウィンドウへ移動
Prefix + n :次のウィンドウ番号のウィンドウへ移動
Prefix + p :前のウィンドウ番号のウィンドウへ移動
Prefix + w :ウィンドウ一覧の表示と切り替え

ウィンドウの削除
Prefix + &

ペインの操作

ペインの分割
Prefix + % :垂直分割
Prefix + " :水平分割

ペイン間の移動
Prefix + o :次のペインへ移動
Prefix + q (数字の入力) :任意のペインへ移動

ペインの分割解除
Prefix + x

おすすめ設定

上で実際に手を動かしてみて、デフォルトではあまりにも使いづらいことを体感いただけたかと思います。ここからは使いやすいtmuxするべく、.tmux.confに設定を書いていきます。
とりあえずおすすめの設定で動かしたいという方はこちらを参考にしてください。

使いやすいキーバインドに設定

~/.tmux.confに以下の設定を書きます。
まずはデフォルトのPrefixを変更します。Ctrl+bはVimで連続で使用するためCtrl+tに変更します。とはいえ、Ctrl+tもCtrlP等のプラグインでタブで開く際に使用したりするので、Ctrl-tを2回押すことでCtrl+t自体も入力できるようにしておきます。

##Keybind
#Change default prefix
set-option -g prefix C-t
bind-key C-t send-prefix #Ctrl+t + Ctrl+tでCtrl+tを入力
unbind-key C-b

デフォルトのペイン分割は覚えづらいことこの上ないので直感的なバインドに変更します。

# | でペインを縦に分割する
bind | split-window -h
# - でペインを横に分割する
bind - split-window -v

ペイン移動に関してもVimと同じように移動できるように変更します。

# Vimのキーバインドでペインを移動する
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

Prefixを押してからHJKL(Shift+h,j,k,l)でペインのサイズを変更できるようにします。 -rを指定することでPrefixを押したあと、連続でコマンドを実行することができます。

# Vimのキーバインドでペインをリサイズする
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5

ウィンドウの移動はVimでのタブの移動と同じキーにしておくと便利かもしれません。

#window move
bind -r C-h select-window -t :-
bind -r C-l select-window -t :+

ここまで設定が書けたら、一度設定を反映させましょう。まずtmuxをデタッチ(Prefix+d)します。下のコマンドを実行して設定をsourceしましょう。typoがあれば何かしらのエラーが出ます。

$ tmux source ~/.tmux.conf

tmuxの設定をリロードする設定

いちいちデタッチしてから設定を読み込むのは面倒なので、tmux上で設定を再読み込みする設定を書きます。tmux.confに以下を書き込みます。

bind r source-file ~/.tmux.conf \; display "Reloaded!"

面倒ですがもう一度tmuxをデタッチして設定をsourceしましょう。これ以降は、Prefix+rで設定をsourceすることができます。

コピーに関する設定

コピー機能を使う上でクリップボードを使えるアプリをインストールします。

$ sudo apt install xsel

コピーに関する設定は以下のようにします。tmuxのバージョンが2.4未満の方はこの設定を参考にしてください。基本的にはvimと同じ挙動にしてありますが、行頭、行末への移動をH,Lに当てています。本当はSpace + h,Space + lとかにしたかったのですが、tmuxでSpaceを指定する方法がわかりませんでした。

#tmux version < 2.4
#Use vi style key bindings in copy mode
set-window-option -g mode-keys vi
#Prefix+v でコピーモード開始
bind-key v copy-mode
#pでバッファをペースト
bind-key p paste-buffer
bind-key -t vi-copy v begin-selection
bind-key -t vi-copy V select-line
#Ctrl-Vで矩形モードに切り替え
bind-key -t vi-copy C-v rectangle-toggle
#y or Enterでヤンクしてクリップボードにコピー
bind-key -t vi-copy y copy-pipe "xsel -bi"
bind-key -t vi-copy Enter copy-pipe "xsel -bi"
#ESCでコピーモードを抜ける
bind-key -t vi-copy Escape cancel
#Hで行頭
bind-key -t vi-copy H start-of-line
#Lで行末
bind-key -t vi-copy L end-of-line


tmuxのバージョンが2.4以上の方はこちらの設定を利用してください。

#tmux version >= 2.4
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi V send-keys -X select-line
bind-key -T copy-mode-vi C-v send-keys -X rectangle-toggle
bind-key -T copy-mode-vi y send-keys -X copy-pipe "xsel -bi"
bind-key -T copy-mode-vi Enter send-keys -X copy-pipe "xsel -bi"
bind-key -T copy-mode-vi Escape send-keys -X cancel
bind-key -T copy-mode-vi H send-keys -X start-of-line
bind-key -T copy-mode-vi L send-keys -X end-of-line

プラグインの設定

tmuxには便利なプラグインが多数用意されています。これらをインストールすることでさらに便利なターミナル環境を構築できます。まずはtmuxのプラグインマネージャであるtpm(TmuxPluginManager)をインストールしましょう。
gitからtpmをクローンしてきます。

$git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm

.tmux.confの最後に以下の設定を追加します。

# List of plugins
set -g @plugin 'tmux-plugins/tpm'

# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'

tpmの基本的な操作は以下の通りです。
プラグインのインストール: Prefix + I
プラグインのアップデート: Prefix + U
プラグインのアンインストール: Prefix + Alt + u

カラースキームの設定

tmuxプラグインをインストールする準備ができたので、さっそくカラースキームを入れてtmuxの見た目を良くしましょう。今回はsolarizedを入れます。

set -g @plugin 'seebi/tmux-colors-solarized'

設定をsourceしてから、Prefix+Iでプラグインをインストールしましょう。tmuxの色が変わったと思います。

セッションの自動保存と自動読み込み

冒頭でお見せしたセッションの自動保存と自動読み込みについて説明します。これらの機能を実現するにはtmux-resurrectとtmux-continuumを入れます。

set -g @plugin 'tmux-plugins/tmux-resurrect'    #Prefix C-sでセッション保存 C-rでセッションリロード
set -g @plugin 'tmux-plugins/tmux-continuum'
    set -g @continuum-restore 'on'              #tmuxスタート時に自動で復元
    set -g @continuum-save-interval '1'         #セッションを保存する間隔を1分にする

設定をsourceしてから、Prefix+Iでプラグインをインストールしましょう。まずtmux-resurrectの機能としてPrefix + Ctrl+sでセッションの保存、Prefix + Ctrl+rでセッションのロードができるようになっていると思います。またPCを再起動してからtmux lsをすると再起動前のセッションが残っています。ここからtmux attachで任意のセッションを開きましょう。
(本当はPC起動時にtmuxが起動して、自動でセッションを読み込むようにしたかったのですが、Ubuntuではすぐに設定できませんでした。また勉強してから書こうと思います。MACの方はすぐにできるので便利ですね)

最終的な.tmux.conf

これが上の設定をすべて盛り込んだ最終的な.tmux.confです。これを~/.tmux.confに保存してtmuxを立ち上げれば、設定がロードされます。以降はPrefix(この設定の場合Ctrl+t) + rで設定をリロードすることができます。Prefix+Iでプラグインのインストールができます。

##Keybind
#Change default prefix
set-option -g prefix C-t
bind-key C-t send-prefix
unbind-key C-b
# | でペインを縦に分割する
bind | split-window -h
# - でペインを横に分割する
bind - split-window -v
# Vimのキーバインドでペインを移動する
bind -r h select-pane -L
bind -r j select-pane -D
bind -r k select-pane -U
bind -r l select-pane -R
#window move
bind -r C-h select-window -t :-
bind -r C-l select-window -t :+
# Vimのキーバインドでペインをリサイズする
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5
#window move
bind -r C-h select-window -t :-
bind -r C-l select-window -t :+

##Copy
#Use vi style key bindings in copy mode
set-window-option -g mode-keys vi
#Prefix+v でコピーモード開始
bind-key v copy-mode
#pでバッファをペースト
bind-key p paste-buffer
bind-key -t vi-copy v begin-selection
bind-key -t vi-copy V select-line
#Ctrl-Vで矩形モードに切り替え
bind-key -t vi-copy C-v rectangle-toggle
#y or Enterでヤンクしてクリップボードにコピー
bind-key -t vi-copy y copy-pipe "xsel -bi"
bind-key -t vi-copy Enter copy-pipe "xsel -bi"
#ESCでコピーモードを抜ける
bind-key -t vi-copy Escape cancel
#Hで行頭
bind-key -t vi-copy H start-of-line
#Lで行末
bind-key -t vi-copy L end-of-line

# ウィンドウ分割後もカレントディレクトリに留まる
#if-shell "~/dotfiles/bin/tmux-version-check 1.9" '
bind c new-window -c "#{pane_current_path}"
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"

# ウィンドウを閉じた時に番号を詰める
#if-shell "~/dotfiles/bin/tmux-version-check 1.7"
set-option -g renumber-windows on

##Color
# 256色端末を使用する
set -g default-terminal "screen-256color"

##Status bar
# ステータスバーを Utf-8 に対応
set-option -g status-utf8 on
# ステータスバーを1秒毎に描画し直す
set-option -g status-interval 1
# 左右のステータスバーの長さを決定する
set-option -g status-left-length 90
set-option -g status-right-length 90
# 最左に表示 #H(マシン名) #P(ペイン番号)
set-option -g status-left '#H:[#P]'

##Others
#enable mouse
set-option -g mouse on

#reload settings
bind r source-file ~/.tmux.conf \; display "Reloaded!"

#set history limit 10000
set-option -g history-limit 10000

# List of plugins
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'seebi/tmux-colors-solarized'
    set -g @colors-solarized '256'
set -g @plugin 'tmux-plugins/tmux-resurrect'    #Prefix C-sでセッション保存 C-rでセッションリロード
set -g @plugin 'tmux-plugins/tmux-continuum'
    set -g @continuum-restore 'on'              #tmuxスタート時に自動で復元
    set -g @continuum-save-interval '1'         #セッションを保存する間隔を1分にする
    #set -g status-right 'Continuum status: #{continuum_status}' #continuumのステータスを表示

# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'


dotfilesの設定方法
.tmux.confもgithub等に保存してすぐに環境構築できるようにしたいですよね。dotfilesの管理方法を下の記事にまとめました。
www.g104robo.com