All Articles

これから育てていくtmuxの設定

はじめ

普段コーディングするときには tmux & vim,たまに VSCode を使っています. vim に関してはまだまだ小学生レベルですが,せっかくブログを始めたことですし自分の作業環境を記しておこうと思います. 何年か後に自分の成長具合を確かめる柱の傷になるでしょうか.

。o ○ (こういう記事を書くの夢だったんですよねぇ…)

この記事は tmux 編です.

.tmux.conf

先人の方々の設定を参考にサクッと設定します. prefix キーをCtrl-tに設定します.

set -g prefix C-t
unbind C-b

ペイン間の移動を vim-like なバインド(hjkl)にしたかったので,ペインのリサイズも(HJKL)に割り当てます. すると h キーがコンフリクトするので,ペイン分割はprefix-key + t(縦)とprefix-key + y(横)にします.

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

bind t split-window -h
bind y split-window -v

あとは OS のクリップボードとの共有,コピーモードを vim バインドにするためアレコレします.

if-shell "uname | grep -q Darwin" \
  'set-option -g default-command "reattach-to-user-namespace -l zsh"'
if-shell "uname | grep -q Darwin" \
  'bind-key -T copy-mode-vi y send -X copy-pipe-and-cancel "reattach-to-user-namespace pbcopy"'

setw -g mode-keys vi
bind -T copy-mode-vi v send -X begin-selection
bind -T copy-mode-vi V send -X select-line
bind -T copy-mode-vi C-v send -X rectangle-toggle
bind -T copy-mode-vi y send -X copy-pipe-and-cancel "pbcopy"
bind -T copy-mode-vi Y send -X copy-pipe-and-cancel "pbcopy"

bind-key C-p paste-buffer

ステータスバーは実行中のプログラムと時刻が表示されていればいいかなと思うので,特にこだわりはありません. 強いて言うなら下に表示しています.

set-option -g status-position bottom
set-option -g status-left-length 90
set-option -g status-right-length 90
set-option -g status-left '#H:[#P]'
set-option -g status-right '#(wifi) #(battery --tmux) [%Y-%m-%d(%a) %H:%M]'
set-option -g status-interval 1
set-option -g status-justify centre
set-option -g status-bg "colour238"
set-option -g status-fg "colour255"

他のオプションについては要研究ですね… tmux の真の力を全く引き出せていない自覚はあります.

ペイン分割

tmux のペイン分割はスクリプトに書いて実行しています. ペインの分割はサブコマンドっぽく指定できるようにしています. 一覧はこんな感じです.

  • simple mux simple シンプルな分割です.ちょっとした作業なんかはこれを使います.
tmux split-window -v
tmux split-window -h
tmux resize-pane -D 15
tmux select-pane -D
clear
  • ide mux ide 少し込み入った作業をするときに使おうとしたんですが,simpleから分割して行き着く流れが多いです.
tmux split-window -v
tmux split-window -h
tmux resize-pane -D 15
tmux select-pane -D
tmux split-window -h
tmux select-pane -D
clear
  • remote mux remote リモートサーバに ssh するときに使う分割です. mux remote HOSTNAMEといった感じでホスト名を指定すると,分割後にメインのペインで ssh 接続を実行するようにしました. 左側で ssh 接続,右側でローカルの作業をできるようにしています. ファイルのやり取りがあるときには便利です. 接続先で tmux セッションを立ち上げるために,左側を広めにとっています.
tmux split-window -h
tmux split-window -v
tmux resize-pane -D 15
tmux select-pane -t 0
clear
if [ -n "$2" ]; then
    /usr/bin/ssh "$2"
fi
  • xremote mux xremote 2 台のリモートサーバと接続するときに使います. ほかは上のremoteと同じです.
tmux split-window -h
tmux split-window -v
tmux resize-pane -D 15
tmux select-pane -t 0
tmux split-window -v
tmux select-pane -D
clear
if [ -n "$2" ]; then
    /usr/bin/ssh "$2"
fi
  • dev mux dev 一番使います. 開発するときにはこの分割です. 一番広いところでコーディング,隣でビルドや devServer の立ち上げ・監視を行い,下側の 3 つで git などその他の細々とした作業をしています. 最近は上側を分割せず横いっぱいに vim を起動し,vim 内で画面分割を使ってコーディングすることが多くなりました.
tmux split-window -v
tmux split-window -h
tmux resize-pane -D 15
tmux resize-pane -R 50
tmux last-pane
tmux split-pane -h
tmux select-pane -D
tmux split-window -h
tmux resize-pane -R 40
tmux last-pane
clear

このスクリプトをエイリアスに設定し,実行…と行きたいところですが,その前にひと処理かませています. リモートサーバに接続するときは,tmux セッションに入る前に iTerm の背景を変えておきたいのです.(事故防止のため)

そのため,以下のような関数を実行して,背景の変更などを行っています. tmux send-keysを使って tmux セッション内で先程のスクリプトを実行させるのがミソです.

# ペイン分割用スクリプトのエイリアスを作成
alias 'mux.sh'='~/.scripts/mux.sh'

function tmux_session() {
    if [ -n "$TMUX" ]; then
        mux.sh "$@"
	return 0
    fi

    if [ -n "$1" ]; then
		if [ -n "$2" ]; then
	    	itermprof "$2"
		    tmux new -d -s "${1}-${2}"
		    tmux send-keys -t "${1}-${2}" "mux.sh ${1} ${2}" C-m
	    	tmux attach-session -t "${1}-${2}"
		    itermprof kahma
		else
	    	tmux new -d -s "${1}-${PWD##*/}"
	    	tmux send-keys -t "${1}-${PWD##*/}" "mux.sh $1" C-m
	    	tmux attach-session -t "${1}-${PWD##*/}"
		fi
    else
    	tmux
    fi
}

# 関数のエイリアスを設定
alias mux='tmux_session'

かんたんに内容を説明すると,

  1. すでに tmux セッション内であれば画面分割のスクリプトを実行し終了.
  2. ホスト名の指定(第 2 引数)が存在する場合は iTerm のプロファイルを変更(itermprof … の部分)
  3. 分割パターン名+(第2引数 ? ホスト名 : ディレクトリ名)で新規セッションを立ち上げ
  4. 画面分割のスクリプトをセッション内で実行
  5. セッションにアタッチ

となります. itermprofは iTerm のプロファイルを変更するための関数です. といっても実行しているのは一行だけです.

function itermprof() { echo -ne "\033]1337;SetProfile=$@\a" }

tmux セッション内だった場合の分岐で iTerm のプロファイル変更を入れていないのは,tmux セッション内にいる状態では iTerm のプロファイルを変更しても背景などが反映されなかったからです. 今は変わっているかもしれないですが,このあたりは習慣づけでなんとかできそうな問題なので,そのままです.

さいご

いろんな方の設定を参考に気分で設定を変えています. vim 編も良ければどうぞ. 暇つぶしにはなれると思います.たぶんですけど.