tmux設定あれこれ

SSHでサーバにリモート接続してあれこれ作業って時に!!
画面を分割できたり、ネットワーク切断でもセッションを保持していて切断前の状態をキープしていてくれる優れもの。
そう、そいつの名はtmux。

元々は GNU Screen 使ってたけど、縦分割した際に時々境界線がずれたりする不具合があったりして乗り換え。

設定ファイル

今回インストールした環境はFedora18だったので、インストールは yum install tmux コマンドで終わり。
~/.tmux.conf ファイルを作成して環境設定を行う。

  • Ctrl-t で色々操作できる様にする
  • 日本語に対応させる
  • 256色対応にさせる
  • マウススクロールに対応させる
  • コピーモードのキーバインドをvi風にする
  • ペイン移動もvi風なキーバインドにする
  • 格好よさげな色に変更してやる気を出す

以上の要件を満たす設定ファイルがこれだ!

#プレフィックスをCtrl-bからCtrl-tに変更
unbind C-b
set -g prefix C-t
bind C-t send-prefix

#日本語対応
setw -g utf8 on
set -g status-utf8 on

#キーバインドをvi風に
set-window-option -g mode-keys vi

#256色対応
set -g default-terminal "xterm-256color"
set -g terminal-overrides "term:colors=256"
set -g display-time 2000

# 異なるサイズの端末からアクセスした時にリサイズ
setw -g aggressive-resize on

#マウススクロール反映
set-window-option -g mode-mouse on

#-------------
# Keybind変更
#-------------
unbind r
bind r source-file ~/.tmux.conf \; display "Config file is reloaded!"

# Keybind ウィンド分割
bind | split-window -h #縦分割
bind - split-window -v #横分割

# Keybind ウィンド切り替え
bind -r C-p select-window -t :-
bind -r C-n select-window -t :+

# Keybind ペイン切り替え(Vim風)
bind j select-pane -D #down
bind k select-pane -U #up
bind h select-pane -L #left
bind l select-pane -R #right

# カーソルキーでペインの大きさ変更(連打対応)
bind -r Up resize-pane -U
bind -r Down resize-pane -D
bind -r Left resize-pane -L
bind -r Right resize-pane -R


### COLOUR (Solarized dark改)

# default statusbar colors
set-option -g status-bg colour235 #base02
set-option -g status-fg colour136 #yellow
set-option -g status-attr default

# default window title colors
set-window-option -g window-status-fg colour244 #base0
set-window-option -g window-status-bg default
set-window-option -g window-status-attr dim

# active window title colors
set-window-option -g window-status-current-fg colour166 #orange
set-window-option -g window-status-current-bg default
set-window-option -g window-status-current-attr bright

# pane border
set-option -g pane-border-fg colour240 #base01
set-option -g pane-active-border-fg colour166 #orange

# message text
set-option -g message-bg colour235 #base02
set-option -g message-fg colour166 #orange

# pane number display
set-option -g display-panes-active-colour colour33 #blue
set-option -g display-panes-colour colour166 #orange

# clock
set-window-option -g clock-mode-colour colour64 #green

色に関しては、「tmuxのおすすめ設定 - Qiita」を参考に、「https://github.com/altercation/solarized/tree/master/tmux」の設定を若干変更して貼り付け。
使ってるターミナルが背景透過してて、そのままの色では見えなかったのよ・・・

起動時に画面分割

んで。起動時にウインドウ分割させる。「tmux起動時に分割する - Qiita」を参考に作る。
上に作業メインのウィンドウを表示し、下側にコマンド実行用ウィンドウを表示する。その右側にtopコマンドが常に表示されるように分割してみる。

+----------+
|workspace |
|          |
+------+---+
|cmd   |top|
+------+---+

まず、~/.tmux/new-session ファイルに以下のウインドウ分割コマンドを書く。

  • lの数値 25 や 80 は分割したウィンドウの高さ(幅)なので、環境に応じて変更する。

上下に分割した後に下のウィンドウを左右に分割すればよい。

#画面を分割して右下はtopコマンド実行
select-pane -t 0
split-window -v -l 25
select-pane -t 1
split-window -h -l 80 top

#メインのペインをアクティブにする
select-pane -t 0

tmuxはバックスラッシュ[\]とセミコロン[;]でマルチコマンドができる。
これを利用して新規セッション確立時に先ほどの分割コマンドを読み込めばいいのだ。複数コマンドで長くなるので別途ファイルに記載したのよ。

tmux new-session \; source-file ~/.tmux/new-session

でもこれだと、毎回あれだしね。エイリアスに登録して一発起動させよう。
ついでなので、セッションが残っている場合にはアタッチするようにしておこう。
今回構築した環境では、ターミナル起動した時点で $SHLVL が 2 を返していたので以下の様になる。echo $SHLVL コマンドで自分のtmux起動前の環境を確認しよう。
bashの人は.bashrcだし、zshの人は.zshrcだね。そのファイルに追記してしまえばおkさ。

if [ $SHLVL = 2 ]; then
  alias tmux="tmux attach || tmux new-session \; source-file ~/.tmux/new-session"
fi

2023.05.09 追記

最近またtmux活用する機会があったのだけど、仕様が変わってたので最新版設定。
ステータスラインの色設定方法とかが変更になっていた。

分割表示を new-session ファイル読み込みから、tmux内で Ctrl-T + / で実行できるようにした。
それなので、alias設定は不必要となる。
その設定が最終行にあるのだが、そこで設定しているlayout情報が必要になる。
とりあえずはコマンド駆使して理想のレイアウトに分割する。
できあがったら tmux list-window コマンドを実行する。そうすれば以下のような値が取得できる。
この場合であれば dfa0 から 36,3}] までの値が必要になる。

0: zsh* (3 panes) [200x54] [layout dfa0,200x54,0,0[200x35,0,0,0,200x18,0,36{114x18,0,36,2,85x18,115,36,3}]] @0 (active)

この情報を反映させた新しい設定が以下になる。

#プレフィックスをCtrl-bからCtrl-tに変更
unbind C-b
set -g prefix C-t
bind C-t send-prefix

#日本語対応
#setw -g utf8 on
#set -g status-utf8 on

#キーバインドをvi風に
set-window-option -g mode-keys vi

#256色対応
set -g default-terminal "tmux-256color"
set -g terminal-overrides ",xterm-256color:Tc"
set -g display-time 2000

# 異なるサイズの端末からアクセスした時にリサイズ
setw -g aggressive-resize on

#マウススクロール反映
#set-window-option -g mode-mouse on
set -g mouse on
bind -T root WheelUpPane   if-shell -F -t = "#{alternate_on}" "send-keys -M" "select-pane -t =; copy-mode -e; send-keys -M"
bind -T root WheelDownPane if-shell -F -t = "#{alternate_on}" "send-keys -M" "select-pane -t =; send-keys -M"

#-------------
# Keybind変更
#-------------
unbind r
bind r source-file ~/.tmux.conf \; display "Config file is reloaded!"

# Keybind ウィンド分割
bind | split-window -h #縦分割
bind - split-window -v #横分割

# Keybind ウィンド切り替え
bind -r C-p select-window -t :-
bind -r C-n select-window -t :+

# Keybind ペイン切り替え(Vim風)
bind j select-pane -D #down
bind k select-pane -U #up
bind h select-pane -L #left
bind l select-pane -R #right

# カーソルキーでペインの大きさ変更(連打対応)
bind -r Up resize-pane -U
bind -r Down resize-pane -D
bind -r Left resize-pane -L
bind -r Right resize-pane -R


### COLOUR (Solarized dark改)

# default statusbar colors
set-option -g status-bg colour235 #base02
set-option -g status-fg colour136 #yellow

# ステータスラインの更新間隔を1秒にする
set-option -g status-interval 1

# ステータスラインを中央寄せ
set-option -g status-justify "centre"

# ステータスライン左側
set-option -g status-left-length 50
set-option -g status-left "#[fg=colour235,bg=colour136] Session: #S #[default]"

# ステータスライン右側
set-option -g status-right-length 50
set-option -g status-right "#[fg=colour235,bg=colour136] #h | %Y/%m/%d %H:%I:%S "

# ステータスライン中央
set-window-option -g window-status-format " #I: #W "
set-window-option -g window-status-current-format "#[fg=colour235,bg=colour136,bright] #I: #W #[default]"

set-option -g pane-border-style fg=colour240 #base01
set-option -g pane-active-border-style fg=colour166 #orange


# pane number display
set-option -g display-panes-active-colour colour33 #blue
set-option -g display-panes-colour colour166 #orange

# clock
set-window-option -g clock-mode-colour colour64 #green

# 「/」キーで固定レイアウトペイン分割
bind / select-pane -t 0\; split-window -v -l 40 /bin/zsh\; select-pane -t 1\; split-window -h -l 130 top\; select-pane -t 0\; select-layout "1fa0,200x54,0,0[200x35,0,0,0,200x18,0,36{114x18,0,36,1,85x18,115,36,2}]"