複数のターミナルを同時に起動・分割ができるターミナルマルチプレクサ「tmux」を使ってみる
以前はTerminatorというソフトを使っていましたが、tmuxに比べてあまりにも機能が貧弱であったため、こちらに乗り換えました。
使用環境
OS: Ubuntu GNOME 16.04
tmux: 2.1
tmuxの何がうれしいか
ターミナルの分割ができる
画像のようにターミナルを分割して、1つの画面で複数のコマンドを実行します。ROSで複数のノードを立ち上げる時などに重宝します。
セッションの保存
せっかく分けたペイン(上で言う分割されたターミナルのこと)が起動の度にリセットされてしまうのはもったいないですよね。tmuxでは下の動画のようにウィンドウ(タブのようなもの)やペイン、セッションなどを保存してロードすることができます。
(tmux-resurrectを使用)
Prefix + Ctrl+s でセッションを保存し、Prefix + Ctrl+rでセッションのロードができます。
コピーモードが使える
コマンドの出力結果などをコピーする際に、マウスなどでドラッグしていませんか?tmuxならvimのヴィジュアルモードのようにコマンドの出力結果をクリップボードにコピーしたり、コマンドラインに貼り付けて実行させたりできます。エラーメッセージなどをググる時も便利です。
インストール
インストールするには以下のようにします。
$ sudo apt install tmux
tmuxの基本要素
tmuxを理解する上で、Session、Window、Paneの3要素を覚える必要があります。
Paneはターミナルを分割している単位
Windowは複数のPaneを束ねるタブ(のようなもの)
Sessionは複数のWindowを束ねているもの
です。
下が実際のWindowとPaneです。
SessionはPrefix + sやtmux ls等のコマンドを打つとわかります。
基本的な操作
まずは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
参考サイト
resurrect,continuum関係
tmuxメモ : Tmux Resurrectとtmux-continuumで環境の保存/復元 - もた日記
tmux-continuumで再起動前のtmux環境を復活させる | QUARTETCOM TECH BLOG
[Tmux] セッションを自動保存・リストア - Qiita
tmuxのコピー関係
tmuxからクリップボードにコピーする - Qiita
tmux2.4からvi-copyがcopy-modeに変わっていた - Qiita
invalid or unknown command: `bind-key -t vi-copy ....` · Issue #754 · tmux/tmux · GitHub
Custom Vim Bindings in tmux 2.4 | George Ornbo