端末多重化——tmux


tmuxとは

tmuxは英語で"terminal multiplexer"と呼ばれるソフトウェアです。ここでは訳を「端末多重化」としているがどのように動作するのかピンとこないかもしれません。以下はパッケージのDescriptionからの引用です。

Tmux is a "terminal multiplexer", it enables a number of terminals (or windows) to be accessed and controlled from a single terminal. Tmux is intended to be a simple, modern, BSD-licensed alternative to programs such as GNU screen.

要するにひとつの端末から複数の端末を扱うことができるようになるソフトウェアです。tmuxを起動したとき、新しいセッション(session)が作成されます。セッションは疑似端末(pseudo terminals)の集まりで、ペイン(pane)単位で四角く区切られています。ひとつのセッションで複数のペインを作れば、ひとつの端末から任意の数の端末を操作できるようになるわけです。

tmuxはペインを作るたびに端末の画面を分割していくため、端末を全画面で利用していればi3wmと同様にディスプレイを有効に活用できます。しかしtmuxを使う最も大きな利点は、セッションそのものが削除(destroy)されない限りセッション内の疑似端末上で動くソフトウェアが中断されないことにあります。よく「サーバ構築時にtmux上で作業していれば、ネットワークの問題で接続が途切れても安心」と言われるのはこれが所以です。

インストール

pkgsrc(7)ではmisc/tmuxとして提供されていますが、NetBSD 8.0ではベースシステムに取り込まれているので特にインストール作業は必要ありません。

設定ファイル $HOME/.tmux.conf

本稿では以下の設定ファイル$HOME/.tmux.confを例にします。

set -g prefix C-t $ prefix is ctrl-t
set -g bell-action none # Ignore all bell.
set -g mode-keys vi # vi keybinding when copy or select mode.
set -sg escape-time 20 # Magic.
set -g default-terminal screen-256color
set -g terminal-overrides 'xterm:colors=256'

# xclip
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xclip -selection clipboard -i"
bind-key -T copy-mode-vi enter send-keys -X copy-pipe-and-cancel "xclip -selection clipboard -i"

unbind C-b # Unbind ^b because that conflict to shell cursor action.

bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
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

set-option -g status-bg colour208
set-option -g status-fg colour0

set-option -g default-shell /usr/pkg/bin/zsh
set-option -g default-command /usr/pkg/bin/zsh

# Show pane's number while 5 seconds
set -g display-panes-time 5000

操作方法

tmuxの操作は「プレフィックス+キー」が基本です。上記の設定ファイルではプレフィックスをCtrl-tにしていますから、tmuxの操作はCtrl-tプラスなにかのキー入力ということになります。本稿では「$prefix-x」という形式で表します。

キー操作動作
$prefix-"ペインを横に分割する。
$prefix-%ペインを縦に分割する。
$prefix-h左のペインに移動する。
$prefix-j下のペインに移動する。
$prefix-k上のペインに移動する。
$prefix-l右のペインに移動する。
$prefix-H右隣のペインが左に向かって大きくなる。
$prefix-J上のペインが下に向かって大きくなる。
$prefix-K現在のペインが上に向かって大きくなる。
$prefix-L現在のペインが右に向かって大きくなる。
$prefix-x現在のペインを終了する(この入力のあとにyで終了。nで取り消し)