Setting WSL - tmuxを使った画面分割 -

データ解析を行う際に1つの画面だけでは不便なため、tmux を使った画面分割を使えるように設定しました。

What's tmux?

tmux (Terminal MUltipleXer)とは、ターミナルマルチプレクサと呼ばれる仮想端末マネージャです。1つの端末で複数の端末を同時に操作することを主目的に開発が行われているソフトウェアですが、ここでは 1つの画面を複数に分割できる という機能を利用するためにtmuxを利用しています。tmuxを利用することで以下の図のように画面を分割し、データ解析の効率向上を目指します。

また、似た機能を持つソフトウェアとしてGNU Screenがありますが、tmuxはデフォルトでWSLのUbuntuにインストールされているため、tmuxを利用しています。

f:id:ttyskg:20191008093214p:plain
tmuxによる画面分割の例

How to Use tmux?

基本操作

tmuxの起動はbashで tmux とコマンドすることで起動できます。tmuxでできることは非常に多岐に渡りますが、ここでは画面分割に関わる操作のみに絞って説明します。

tmuxの操作の基本は、 プレフィックスキー + コマンド となっています。デフォルトのプレフィックスキーは C-b (Ctrl-b)となっています。例えば、画面を縦に分割する時は C-b % となります。これは、 C-b を押してから、% を押すことを意味します。以下にデフォルトで画面分割に関わる操作をまとめました。

操作 キーバインド
画面を縦に分割 C-b %
画面を横に分割 C-b "
次の画面に移動 C-b o
上の画面に移動 C-b ↑
下の画面に移動 C-b ↓
右の画面に移動 C-b →
左の画面に移動 C-b ←
画面を閉じる C-b x ※

※:画面を閉じようとすると、画面下部に kill pane ? [y/n] と表示されるため、y と入力する。

tmuxのカスタマイズ

デフォルトの設定は少し使いにくいところや操作が直感的ではないところがあったため、少しカスタマイズを行いました。カスタマイズは .tmux.conf ファイルに記述し、このファイルをユーザーのホームディレクトリに置く、または dotfilesとして管理する と良いでしょう。

デフォルトのプレフィクスキーである C-b は、vimの「後方への1画面スクロール」と競合します。そのため、他のキーに変更したいところですがほぼ全てのキーが既に使用されており、あまり選択肢がありません。(参考リンク 、またはvimのコマンドラインで help index.txt と入力するとマニュアルを確認できます。)

私はvimで使用されていない C-s をtmuxのプレフィックスキーとして使用することにしました。ここは好みで、vimで使用しないショートカットを上書きしても構いません。この際、私の環境ではtmuxのプレフィックスキーが優先され、vimのキーバインドを無効化する必要はありませんでした。また、 C-s もvimでは使用されていないものの、端末で「画面への出力停止」に割り当てられています。しかし、この設定もtmuxの設定が優先されるため、特に無効化する必要はありませんでした。

以上を踏まえ、私は '.tmux.conf' を以下のようにカスタマイズを行いました。

# プレフィックスキーをCtrl-gに変更
set -g prefix C-g

# C-bのキーバインドを無効化
unbind C-b

# prefix r で設定ファイルのリロード
bind r source-file ~/.tmux.conf \; display "Reloaded!" 

# prefix | で画面を縦に分割
bind | split-window -h

# prefix - で画面を水へに分割
bind - split-window -v 

# 画面間の移動をvimのキーバインドに変更
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# 画面のサイズを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

# 16色端末を使用
set -g default-terminal "screen-16color"

# コピーモードを設定する
## viのキーバインドを使用する
setw -g mode-keys vi
## コピーモードの操作をvi風に設定する
### xselが必要
bind-key -t vi-copy v begin-selection
bind-key -t vi-copy C-v rectangle-toggle
bind-key -t vi-copy y copy-pipe "xsel -ip && xsel -op | xsel -ib"
## デフォルトのEnterでもコピーできるようにキーバインドを変更
unbind -t vi-copy Enter
bind-key -t vi-copy Enter "xsel -ip && xsel -op | xsel -ib"

設定内容についてはファイルの中でコメントしてあるとおりです。16色端末については、これを設定しないとtmux起動下でvimを使用すると背景の色がおかしくなります。

コピーモードの設定

tmuxで分割した画面間でコピーをvimのキーバインドで使えるように設定しました。設定内容は上記の .tmux.conf に追記してあります。また、この機能を使うためには sudo apt-get install xselxsel をインストールする必要があります。

上記の設定を行った場合、次のような挙動となります。 まず、 prefix [ を押してコピーモードに入ります。そして、以下の操作でコピーを行います。

操作 キーバインド
コピーする部分を選択 v
矩形選択モードに変更 C-v
選択部分をコピー y (Enter)

そして、 prefix ] でペーストを行います。vimに貼り付ける際は、挿入モードに入ってからペーストしないと1文字目が欠落します。(この部分でしばらくハマりました)

また2017年11月20日現在では、WSLのUbuntuに入っているtmuxのバージョンは2.1となっていますが、今後tmuxのバージョンが上がった場合、もしくは自分で最新のtmuxを導入した場合は設定を以下のように変える必要があります。(参考

# コピーモードを設定する
## viのキーバインドを使用する
setw -g mode-keys vi
## コピーモードの操作をvi風に設定する
### xselが必要
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi y send-keys copy-pipe-and-cancel "xsel -ip && xsel -op | xsel -ib"
## デフォルトのEnterでもコピーできるようにキーバインドを変更
unbind -T copy-mode-vi Enter
bind-key -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "xsel -ip && xsel -op | xsel -ib"

参考

tmuxで快適なターミナル生活を送ろう 達人に学ぶ.tmux.confの基本設定 tmuxの基本的な操作方法のまとめ vimのnormal modeでctrlキーを使うキーマップ一覧 tmuxマニュアル(英語) vim-colors-solarized breaks inside tmux #159 tmux コピーモードでのキーバインド