とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど
読者登録と各種SNSのフォローもよろしくお願いいたします。

ぼくのてぃーまっくす

ターミナルマルチプレクサ使ってますか?screenやabducodtachなど色々あります。最近だとZellijなんていうのも出てきてますね。わたくし、最近はもっぱらtmuxに落ち着いていまして、.tmux.confの設定もここ数年変わってないですし、晒してみようかと思います。

そもそもtmuxってなんじゃろ?

github.com

tmuxはターミナルマルチプレクサの一種です。1つの画面で複数の端末を作ったり、制御したりできます。サーバー内で作業しているときに接続が切れてしまっても後から再接続できるように、セッション保護の意味でターミナルマルチプレクサを使ったりします。で、わたくしはというと、ローカルで作業する時も使ってます。なんでローカルで使ってるか、それは単純にLinuxで使ってるターミナルとかMacで使ってるターミナルの設定をするのが面倒だからですね。タブを開く時のキーボードショートカットを複数のターミナルで合わせるのとか面倒ですし、ターミナルによってはペインが使えたり使えなかったりするので。tmuxは.tmux.confさえ共有していれば同じように動作するので、dotfilesとかに含めておくと、設定を合わせるのが楽です。

.tmux.conf

以下がわたくしの使ってるtmuxの設定です。そこまで多くはないですね。

# `をPrefixに
set -g prefix `
unbind C-b; bind ` send-prefix

# カレントディレクトリで新しいウィンドウを開く
bind c neww -c "#{pane_current_path}"

# カーソルキーでペインを移動
bind -r Up if -F '#{pane_at_top}' '' 'selectp -U'
bind -r Down if -F '#{pane_at_bottom}' '' 'selectp -D'
bind -r Left if -F '#{pane_at_left}' '' 'selectp -L'
bind -r Right if -F '#{pane_at_right}' '' 'selectp -R'

# Shift+カーソルキーでペインのサイズを変更
bind -r S-Up resizep -U
bind -r S-Down resizep -D
bind -r S-Left resizep -L
bind -r S-Right resizep -R

# 次のウィンドウを開く時に、ウィンドウがなかったら作る
bind n run 'tmux next || tmux neww'
bind p run 'tmux prev || tmux neww'

# Prefix+NでウィンドウNに移動、移動先のウィンドウがなかったら作る
bind 0 run 'tmux selectw -t :0 || tmux neww -t :0'
bind 1 run 'tmux selectw -t :1 || tmux neww -t :1'
bind 2 run 'tmux selectw -t :2 || tmux neww -t :2'
bind 3 run 'tmux selectw -t :3 || tmux neww -t :3'
bind 4 run 'tmux selectw -t :4 || tmux neww -t :4'
bind 5 run 'tmux selectw -t :5 || tmux neww -t :5'
bind 6 run 'tmux selectw -t :6 || tmux neww -t :6'
bind 7 run 'tmux selectw -t :7 || tmux neww -t :7'
bind 8 run 'tmux selectw -t :8 || tmux neww -t :8'
bind 9 run 'tmux selectw -t :9 || tmux neww -t :9'

# コピーモードをペインで開く
bind C {
  splitw -f -l30% ''
  set-hook -p pane-mode-changed 'if -F "#{!=:#{pane_mode},copy-mode}" "kill-pane"'
  copy-mode -s '{last}'
}

# alt+/でコピーモードに入りつつ、文字列検索
bind -n M-/ copy-mode \; send-key ?

# viキーバインドに
set -g mode-keys vi

# コピーペーストコマンドの設定
if-shell 'command -v xsel &>/dev/null' {
  bind-key -T copy-mode-vi C-j send-keys -X copy-pipe-and-cancel 'xsel -bi'
  bind-key -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel 'xsel -bi'
}

if-shell 'command -v xclip &>/dev/null' {
  bind-key -T copy-mode-vi C-j send-keys -X copy-pipe-and-cancel 'xclip -i -sel clip'
  bind-key -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel 'xclip -i -sel clip'
}

if-shell 'command -v pbcopy &>/dev/null' {
  bind-key -T copy-mode-vi C-j send-keys -X copy-pipe-and-cancel 'pbcopy'
  bind-key -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel 'pbcopy'
}

# $TERMをxterm-256colorに
set -g default-terminal 'xterm-256color'

# ステータスバーの設定、ウィンドウが1つしかなかったらステータスバーを隠す
if -F '#{==:#{session_windows},1}' 'set -g status off' 'set -g status on'
set-hook -g window-linked   'if -F "#{==:#{session_windows},1}" "set -g status off" "set -g status on"'
set-hook -g window-unlinked 'if -F "#{==:#{session_windows},1}" "set -g status off" "set -g status on"'

# マウスモードON
set -g mouse on

# ウィンドウのインデックスは0から
set -g base-index 0

# ステータスバーは下
set -g status-position bottom

# ステータスバーの両サイドには何も表示しない
set -g status-left ''
set -g status-right ''

# ステータスバーのカレントウィンドウはボールドフォントに
set -g window-status-current-format '#[bold]#I:#W#[default]'

# それ以外はノーマル
set -g window-status-format '#I:#W'

まとめ

今はなんとなくtmuxを使ってますが、いいのがあれば乗り換えることもあるかもしれません。もし機会があればまた設定を晒してみます。Zellijは高機能すぎて使いこなせない……