ちょっと話題の記事

【shell】tmuxの作業画面を一発で構築するコマンドを作ってみた

ターミナルマルチプレクサであるtmuxにおいて、ペインを複数分割した作業画面を素早く作成してくれるシェルスクリプトを書きました。
2020.04.24

はじめに

皆さんこんには。CUI信仰に片足を踏み入れている石橋です。現在研修でLinuxを勉強している関係で、シェルスクリプトに慣れてきたので、使用しているtmuxでペインを分割してIDEっぽくしてくれるコマンドを作成してみました。「tmuxとは」のような説明は割愛します。

動作環境

  • bash: 3.2.57
  • tmux: 3.0a

現状と課題

私の現状のtmuxのペイン分割、リサイズに関するキーバインドは以下のようになっています。

動作 キーバインド tmux.conf
水平分割 prefix - s bind v split-window -h -c '#{pane_current_path}'
垂直分割 prefix - v bind s split-window -v -c '#{pane_current_path}'
左に3行リサイズ prefix - H bind -r H resize-pane -L 3
右に3行リサイズ prefix - L bind -r J resize-pane -D 3
下に3行リサイズ prefix - J bind -r K resize-pane -U 3
上に3行リサイズ prefix - K bind -r L resize-pane -R 3

例えば以下のような形にpaneを分割したければ

prefix - s, prefix - v, prefix - J J J J

というような形で分割→リサイズをする必要がありました。これが毎回やっていると非常に面倒になります。というわけで、よく使う作業環境を作ってくれるコマンドを作成します。

画面分割

①vim用, その他用で分割する時

windowを2つのpaneで分割して、上の大きなペインでvimを開きコードやメモを書いて、下の小さめのペインでシェルを使用したい時はこんな形になります。これを作成するコマンドを書いてみます。

tmux split-window -v
tmux resize-pane -D 15
tmux select-pane -t 1

②vim用, コード実行用, git用で分割する時

 

ウィンドウを3分割して、上のペインでvimを開きコードを書いて、左下ペインでコードを実行、右下のペインでGitコマンドを実行したいという時はこんな形になります。これを作成するコマンドは以下のような形になります。

tmux split-window -v
tmux split-window -h
tmux resize-pane -D 15
tmux select-pane -t 1

③最近よくやる分割

最近はEC2のAmazon Linux 2を触って勉強している関係で、複数のEC2インスタンスにsshでログインして作業し、その様子をローカルのvimでメモしたりしています。これを作成するコマンドは以下のようになります。

tmux split-window -h
tmux split-window -v
tmux resize-pane -D 15
tmux select-pane -t 1
tmux split-window -v
tmux select-pane -t 1

④特定のディレクトリに移動してvimを開く

特定の作業をするディレクトリが決まっている場合は、そのディレクトリまで移動してペインを分割、リサイズする必要がありました。自分の場合だとpythonの学習を ~/Desktop/python/ にコードを置いて行っています。このディレクトリに移動してvimを開き、学習をすぐに始められたら便利ですね。これを作成するコマンドは以下のようになります。

cd ~/Desktop/python
tmux split-window -v
tmux split-window -h
tmux resize-pane -D 15
tmux select-pane -t 1
vi .

シェルスクリプト実装

引数で分岐させる

以上のように頻繁に使用する画面分割や今後の拡張性も考えた上で、上記のシェルスクリプトをコマンドの引数で分岐するようにしました。もっとも使用頻度の高いであろう②を引数なし、①・③・④のケースを第一引数がそれぞれ1・2・pyで分岐するようにしました。以下のようなコードになります。

#!/bin/bash

# set tmux panes for ide

if [ "$#" -eq 0 ]; then
  tmux split-window -v
  tmux split-window -h
  tmux resize-pane -D 15
  tmux select-pane -t 1
else
  case $1 in
    1)
      tmux split-window -v
      tmux resize-pane -D 15
      tmux select-pane -D
      clear
      ;;
    2)
      tmux split-window -h
      tmux split-window -v
      tmux resize-pane -D 15
      tmux select-pane -t 1
      tmux split-window -v
      tmux select-pane -t 1
      clear
      ;;
    py)
      cd ~/Desktop/python
      tmux split-window -v
      tmux split-window -h
      tmux resize-pane -D 15
      tmux select-pane -t 1
      vi .
      clear
      ;;
    *)
      echo [ERROR] "$1" は設定されていない引数です。
      ;;
  esac
fi

aliasを設定する

今回作成したシェルスクリプトを実行できるようにパスが通っているディレクトリに配置し、すぐに呼び出せるようにailasを設定します。今回はシェルスクリプトをide.shとし、自分の環境でパスを通した自作シェルスクリプトを置くディレクトリ~/.scripts/ に配置しました。以下を.bashrcに記載します。

alias ide="~/.scripts/ide.sh"

動作確認

まとめ

コマンド一発で作業画面が作成できるととても便利で、作業に入るまでの時間が短縮できます。これからも自動化できるところは自動化していこうと思います。それでは皆さん良いtmuxライフを!!

参考

BSD General Commands Manual TMUX(1)

[更新中] ぼくのVimさばきを支える設定とその導入手順を紹介する

TmuxでPane分割を一括で実行する