🐱

kittyでlazygitをどこでも別タブで開いて終了後に元のタブへ戻れるようにする

に公開

はじめに

先日、Terminal Night #1というイベントに参加してきました。
https://kichijojipm.connpass.com/event/373896/

いろんな話が聞けて面白かったのですが、その中で@watasuke1024さんの「作業環境の可搬性を高めるCLI」という発表のなかでTipsとしてtmux + lazygitでどこからでもポップアップウィンドウで開けるようにする、というものが紹介されていました。

個人的にその手があったかァ~~~、という感じで衝撃走っていました。

tmux popupを使えば同じことはできるのですが、個人的にはkittyを愛用しているので、tmuxを追加で入れるのはちょっとな、、、なのでkittyでできる方法を模索しました。

この記事では、kittyのkitten @リモートコントロール機能を使って、lazygitを別タブで起動し、終了後に元のタブへ自動的に戻る方法を紹介します。

最終的にはこんな感じになりました。

quick-access-terminalではダメだった理由

kittyにはv0.42より追加されたquick-access-terminalという機能があり、ドロップダウンターミナルのような動作を実現できます。最初はこれを使おうと思いましたが、この機能は別ウィンドウとして起動するため、既存のkittyウィンドウ内でタブとして開きたいという要件には合いませんでした。

座標を調整して良い感じにしようかと試行錯誤もしましたが、Macとかはともかく私用のWaylandで特に難しそうだったので断念。

求めていたのは、現在のkittyウィンドウ内で新しいタブを開き、そこでlazygitを起動して、終了したらタブが閉じて元のタブに戻るという動作です。
(ポップアップウィンドウで表示したほうがかっこよくはありますが)

kitten @によるリモートコントロール

kittyにはkitten @というリモートコントロール用のコマンドがあります。これを使うと、外部からkittyの動作を制御できます。

# 新しいタブでコマンドを実行
kitten @ launch --type=tab lazygit

# 作業ディレクトリを指定して起動
kitten @ launch --type=tab --cwd=/path/to/repo lazygit

--type=tabで新しいタブを作成し、指定したコマンドを実行します。コマンドが終了するとタブが自動的に閉じるため、元のタブに戻れます。

kitty.confの設定

割と頻繁に使うので、~/.config/kitty/kitty.confに以下を追加してます。

# リモートコントロールを有効化
allow_remote_control yes

# lazygitを別タブで起動(現在のディレクトリを引き継ぐ)
map ctrl+a>g launch --type=tab --cwd=current lazygit

これだけで、Ctrl+aを押してからgを押すとlazygitが別タブで起動し、qで終了するとタブが閉じて元のタブに戻ります。

挙動としては以下のような感じです。

分割したどのペインからでも、フルレイアウトでのlazygit起動ができます。ペインからコマンドで呼び出すとペインサイズのものになってしまい、複数サーバーの開発などでわりと不便だったのが快適になりました。

他のアプリケーションへの応用

同じ仕組みで他のTUIアプリケーションも起動できます。

# htopを別タブで表示
map ctrl+a>h launch --type=tab htop

# btmを別タブで表示
map ctrl+a>b launch --type=tab btm

まとめ

kittyのkitten @リモートコントロール機能を使うことで、lazygitを別タブで起動し、終了後に自動的に元のタブへ戻る動作を実現できました。設定はkitty.confに1行追加するだけで、追加のスクリプトは不要です。

分割したペインからでも開発中にサッとGit操作をしてすぐ戻れるのは、作業効率の向上につながりとてもQOLが上がりました。

参考文献

https://sw.kovidgoyal.net/kitty/
https://sw.kovidgoyal.net/kitty/remote-control/
https://sw.kovidgoyal.net/kitty/launch/
https://github.com/jesseduffield/lazygit

GitHubで編集を提案

Discussion