🖥️

メインウィンドウにもう場所がない時代に作った tmux-toggle-scratch

に公開

メインウィンドウにもう場所がない時代に作った tmux-toggle-scratch

tmuxでの作業中、ちょっとした確認のために画面レイアウトを崩したくない。そんな課題を解決するポップアップ型スクラッチパッドプラグインを作りました。

問題:画面が足りない時代になった

私はnvim、Claude Code、その他すべての開発作業をtmux上で行っています。エディタで複数ファイルを並べ、Claude Codeと画面分割し、複数プロジェクトを同時表示するなど、画面の不動産はフル活用状態です。

でも、ちょっとした確認作業は必要です。git statusを見たい、開発サーバのログを確認したい、簡単な計算をしたい。

これまでは、あらかじめ小さめのペインで作業用のシェルを表示し、ちょっとした作業が必要な場合はそのペインに移動して実施していました。しかし、この方法には2つの問題がありました。一つ目は、画面が狭いのでPrefix + zでToggle zoomを頻繁に使う必要があること。二つ目は、ペインがたくさんあると作業用シェルのペインに移動するのが面倒なことです。

また、作業のたびに新しいペインを作ることも考えましたが、せっかく整えたエディタ・AIツール・ターミナルの絶妙なバランスが台無しになってしまいます。

tmuxのdisplay-popup機能を使えば画面レイアウトを崩さずにポップアップでシェルを開けることを知りましたが、閉じるたびにシェルが消えてしまうため、コマンド履歴やディレクトリ位置が失われてしまいます。

そんな悩みから tmux-toggle-scratch を作りました。

解決策:tmux-toggle-scratch

display-popupにtmuxのセッション管理機能を追加したのがtmux-toggle-scratchです。ワンキーで作業用シェルをポップアップ表示し、もう一度押すと閉じる。ただそれだけです。でも、セッションは継続しているので、前回の作業内容(コマンド履歴、ディレクトリ、実行中のプロセス)がそのまま残っています。

従来方法のようなToggle zoomの手間もなく、新ペイン作成のようなレイアウト破綻もなく、display-popupのような作業履歴の消失もない。シンプルながら実用性は思った以上でした。

セットアップ

必要要件

tmux 3.2以上が必要です。バージョン確認:

tmux -V

インストール

TPMを使っている場合(推奨):

# ~/.tmux.confに追加
set -g @plugin 'momo-lab/tmux-toggle-scratch'

その後、Prefix + Iでインストール完了です。

手動インストールの場合:

git clone https://github.com/momo-lab/tmux-toggle-scratch ~/.tmux/plugins/tmux-toggle-scratch
# ~/.tmux.confに追加
run-shell ~/.tmux/plugins/tmux-toggle-scratch/tmux-toggle-scratch.tmux

設定を反映:

tmux source-file ~/.tmux.conf

デフォルトのキーバインドはPrefix + Ctrl+sです(Prefixキーを押してから離し、続けてCtrl+sを押す)。

実際の使用例

私が実際にどう使っているかを紹介します。

使用例1:プロジェクトごとのGit作業履歴

「git関連の確認作業で、毎回ペイン移動してコマンドを入力するのが面倒でした」

# Webアプリプロジェクト(ウィンドウ1)でscratchを開く
Prefix + Ctrl+s
git log --oneline -10    # 履歴確認
git status              # 状況確認
git branch -a           # ブランチ確認
Prefix + Ctrl+s         # 同じキー操作でscratchを閉じる

少し後で作業を再開したくなった時:

Prefix + Ctrl+s         # 再度同じキー操作で開く
# ↑キーを押すと、前回実行したコマンドがすぐに使える
# ディレクトリ位置も完全に保持されている
Prefix + Ctrl+s         # 確認後、同じキー操作で閉じる

単純なpopupと違って、コマンド履歴が蓄積されていくので、よく使うgitコマンドにすぐアクセスできます。複数のペインから作業用ペインを探す手間もなく、ワンキーで即座にアクセスできるのも便利です。

使用例2:開発サーバの継続起動

「開発サーバのログ確認で、メイン画面を占有したくありませんでした」

# フロントエンド開発中
Prefix + Ctrl+s
npm run dev
# Viteサーバが起動、ログが流れ続ける
Prefix + Ctrl+s         # サーバは起動したまま、scratchを閉じる

scratchもtmuxなので、さらに分割することもできます:

Prefix + Ctrl+s         # scratchを再度開く
Prefix + "              # scratch内で水平分割
docker-compose up       # バックエンドも同時起動
# フロント・バックエンド両方のログを同時監視可能
Prefix + Ctrl+s         # 両方のサーバが動いたまま、scratchを閉じる

エラーが出た時だけPrefix + Ctrl+sでscratchを開いて確認。ペイン移動の手間もなく、メイン画面のレイアウトは一切崩れません。

使用例3:全く異なるプロジェクトでの完全分離

「複数プロジェクトを並行作業していると、コマンド履歴が混ざるのが困りました」

Webアプリ開発中(ウィンドウ1):

Prefix + Ctrl+s
npm test                # テスト実行
curl localhost:3000/api/users
git log --grep="API"    # API関連のコミット履歴
Prefix + Ctrl+s         # scratchを閉じる

Go CLI開発中(ウィンドウ2):

Prefix + Ctrl+s
# 全く別のscratchセッション!
go test ./...           # テスト実行
go build -o app main.go # ビルド
./app --help            # 動作確認
Prefix + Ctrl+s         # scratchを閉じる

Webアプリに戻る(ウィンドウ1):

Prefix + Ctrl+s
# npm, curl, gitの履歴がそのまま残っている
# GoのCLI開発の履歴とは完全に独立
Prefix + Ctrl+s         # 確認後閉じる

デフォルトでウィンドウごとに独立したscratchセッションが作られるので、プロジェクトの切り替えが非常にスムーズです。

便利だった設定

キーバインドのカスタマイズ

デフォルトのPrefix + Ctrl+s以外にも、好みに合わせてキーバインドを変更できます。

デフォルトキーバインドの変更

# Prefix + aに変更
set -g @toggle-scratch-keys 'a'

# 複数のキーを設定(Prefix + s, Prefix + a, Prefix + Alt+s)
set -g @toggle-scratch-keys 's a M-s'

プレフィックス不要のキーバインド(root-keys)

さらに素早くアクセスしたい場合、プレフィックスキーを押さずに直接実行できるキーバインドも設定できます:

# F12キー一発でscratchの開閉
set -g @toggle-scratch-root-keys 'F12'

# 複数のroot-keys(F12またはAlt+s)
set -g @toggle-scratch-root-keys 'F12 M-s'

注意: root-keysは他のアプリケーションやシステムのショートカットと競合する可能性があります。ファンクションキー(F1-F12)やAltキーの組み合わせを使うと競合しにくくなります。

セッションスコープの調整

デフォルトではウィンドウごとに独立したscratchが作られます。これがほとんどの人にとって最適だと思いますが、必要に応じて調整できます:

# デフォルト設定(ウィンドウごとに別々)- おすすめ
set -g @toggle-scratch-session-name-format "#S-#I@scratch"

他の設定例:

# ペインごと(同じウィンドウでも各ペインで独立)
set -g @toggle-scratch-session-name-format "#S-#I-#P@scratch"

# グローバル(全ての作業で共有)
set -g @toggle-scratch-session-name-format "scratch"

tmuxセッションを複数使い分けている場合:

# セッションごと(一つのプロジェクト全体で共有)
set -g @toggle-scratch-session-name-format "#S@scratch"

ただし、複数のtmuxセッションを使い分けている人は少数派なので、デフォルトのウィンドウごと設定で十分な場合がほとんどです。

ポップアップサイズの調整

# 少し大きめにしたい場合
set -g @toggle-scratch-popup-options '-w90% -h90%'

自動クリーンアップ機能

scratchポップアップを開いたタイミングで、不要になったscratchセッションを自動削除します。例えば、プロジェクトAのウィンドウを閉じた後、別のプロジェクトでscratchを開くと、使われなくなったプロジェクトAのscratchセッションが自動的に削除されます。

この仕組みにより、長期間使っていてもtmuxセッション一覧が汚れることなく、常にクリーンな状態を保てます。

hook方式での即座クリーンアップ(オプション)

より即座のクリーンアップが必要な場合は、window/paneを閉じた時に削除するhook方式も利用できます:

set -g @toggle-scratch-use-hooks 'on'

ただし、tmuxのhooksは同じイベントに複数のhookを登録できないため、既存のhook設定を上書きしてしまう可能性があります。他のプラグインでhooksを使用している場合は、標準のクリーンアップ方式をお勧めします。

通常のdisplay-popupとの違い

項目 display-popup tmux-toggle-scratch
作業環境 一時的プロセス 永続tmuxセッション
コマンド履歴 毎回リセット 蓄積される
ディレクトリ 毎回初期化 前回位置を記憶
プロジェクト分離 なし ウィンドウごとに独立
実行中プロセス 保持されない 継続実行

まとめ

小さなプラグインですが、日常の「ちょっとした確認作業」がかなり楽になりました。メイン画面のレイアウトを崩さずに、でも必要な時にすぐアクセスできます。

AIツールとの画面分割が当たり前になった今、こういった「画面を汚さない」ツールの価値は高まっていると感じます。

気になった方は、ぜひ試してみてください。


リンク

Discussion