- tmux、SSH、nvim、強力な検索・自動化スクリプトを組み合わせ、リモートサーバー上のファイルをGUIなしでも即座に探索・修正・検索できる独自のワークフローを実現
- キー操作ひとつでtmuxの複数ウィンドウからファイル名を自動検索してそのまま開き、ファイル切り替えやバッファ管理までをすべてショートカットで処理
- VSCodeの遅さとキーバインドの衝突に不満を感じ、すべての操作をスクリプトで直接統合
- regex、perl、tmux、nvimなどのUnixツールを組み合わせ、ファイルパス・行情報の自動認識とオープンを実現
- 自前での実装過程は非常に複雑だが、ターミナルの強力さと拡張性を最大限に引き出せることを示している
自分だけのターミナルの使い方
- この記事は、ターミナルと各種ツールを組み合わせて効率的な開発環境を構築した経験を共有するもの
- 一般的には動画が必要になるほど複雑な内容のため、テキストとあわせて実演動画を用意している(動画視聴推奨)
- 動画内の一部の手順(0:11、0:21、0:41)は、多くの人が「こんなことが可能なのか?」と驚く部分
動画内のターミナルワークフローを段階別に要約
- 0:00 : ノートPCでWindows Terminalを起動
- 0:02 : ctrl + shift + 5 のショートカットで新しいターミナルタブを開き、
sshで自宅のデスクトップに接続して、すぐにtmuxを起動
- 0:03 : tmuxで標準シェルのzshを実行し、プロンプトを表示して全体設定を非同期でロード
- 0:08 :
zoxideで最近使ったディレクトリをfuzzy検索して移動
- 0:09 : ripgrepコマンドの入力を開始すると、zshが過去の使用履歴にもとづいて自動補完し、ctrl + fで確定
- 0:11 :
ctrl + kf ショートカットでtmuxのスクロールバック全体からファイル名を検索し、ファイル名が青色でハイライト表示される
- 0:12 :
n キーを押し続けて、検索されたファイル一覧から目的のファイルをたどる
- 0:21 :
o キーで選択したファイルを既定アプリ(nvim)で開くと、tmuxが新しいウィンドウで実行される(引き続きリモートサーバー上で動作)
- 0:26 : rust-analyzerでコード内の複数の参照へ移動しようとするが、一部のマクロは認識に失敗し、0:32で正常に移動成功
- 0:38 :
ctrl + kh でtmuxのフォーカスを左のウィンドウに切り替え
- 0:39 :
n キーを再び押して、"copy-mode" 状態のまま前のファイル検索結果を引き続きたどる
- 0:41 :
o キーで今度は別のファイルを既存のnvimインスタンスで開く
- 0:43 :
b キーで開いているファイルのバッファ一覧を確認し、2つのファイルを交互に切り替えながら終了
なぜこのようなターミナルワークフローを使うようになったのか?
- VSCodeが遅く、特にvimプラグイン使用時にかなりもたつく
- エディタ、vimプラグイン、ターミナル、ウィンドウ管理機能の間でキーバインドの衝突が頻繁に発生して不便だった
- Zedエディタも試したが、当時はまだ未成熟で、キーバインド衝突の問題も依然として残っていた
- nvim(Neovim)をターミナル上で直接使い始めたものの、
- ripgrepなどで検索したファイル名をいちいちコピーしてエディタに貼り付ける作業があまりにも煩雑だった
- 特にripgrepの結果にファイル名と行番号が一緒に出ると、
- 貼り付けるたびに構文エラーが発生する
- 実際にファイルを開く前に不要な編集をしてしまうことが多くなる
- VSCodeのctrl-clickのように、ファイルパスをそのまま開けるワークフローが必要だと感じた
- そこでtmuxを使って必要な機能を自分で実装することになった
- 「なぜtmuxを使うのか」と聞かれたら、まさにこの自動化とセッション維持のためだと説明している
- ターミナルは思っている以上に強力だが、標準機能だけではこの種の自動化は見えにくい
- tmuxは古く、文法も複雑でバグもあるが、拡張性とカスタマイズ性を理由に選んだ
主な実装方法
tmuxでスクロールバック全体のファイル名を検索
選択したファイルを新規ウィンドウ/現在のウィンドウで開く
すでに開いているnvimインスタンスでファイルを開く
- perlスクリプトでtmuxが特定のnvim paneを見つけ、そのpaneにファイル/行情報まで直接キー入力を送信
file:line:column 構文をvimコマンドに変換して自動オープン
この方式の利点と限界
- ローカルターミナルの機能制限を克服: tmuxを通じてリモートサーバー上で自由なファイル探索・修正・検索を実現
- エディタがリモート編集プロトコルをサポートしていなくても同じワークフローが可能
- すべてのキーバインド・検索・ファイル切り替え・バッファ管理などを完全に自分好みに統合
- VSCodeプラグインを作るよりも、より速く簡単に自動化できる
- 自作スクリプトは壊れやすく保守も難しいため、人に勧めにくい
代替ソリューション
- おおむねおすすめできるオープンソース/ツールの組み合わせ:
fish + zoxide + fzf: fuzzyなディレクトリ移動、コマンド検索、一部のファイル検索ワークフローの代替が可能
- エディタ内蔵機能(タブ、ウィンドウ、fuzzy finderなど)でも大半のユーザーには十分
qf: ターミナル出力からファイル選択はできるが、インタラクティブなツールとは連携不可、viライクなCLIを使用
e: file:line パスを認識する小さなツール(エディタの種類ごとに別スクリプトが必要)
vim --remote, code filename, emacsclient なども似た効果があるが、file:line認識は不完全
結論と教訓
- ターミナルは思っている以上に強力で、スクリプトで組み合わせればGUIツールでは不可能な自動化も可能
- ただし、保守性やスクリプトに内在するバグなど、実用上の限界はある
- ターミナルワークフローの自動化に関心があるなら、カスタムのtmux/nvim/fzf環境から段階的に構築していくのが現実的
1件のコメント
Hacker Newsのコメント
自分も似たようなトリックを使っている。tmuxのスクロールバックを活用し、トークン化された出力をzshにパイプして、tmux画面に見えているあらゆるものに対して補完機能を使えるようにしている。関連Threads投稿とgistコードも共有している。本当に便利だった
こういうワークフローのやり方が本当に好きで、自分も何年も同じようなものを繰り返し磨いている。時間が経つにつれて、カスタム層はできるだけ減らそうとしている。オーバーレイが増えるほど保守コストが大きくなるからだ。素のVim(tmuxなし)でも投稿で紹介されていることの大半はできる。たとえば
rg --vimgrep restore_tool | vim -c cb -のようにできる(vim -c cb -はVimで一番好きな機能で、みんながほとんど使っていないのが不思議なくらいだ)。もちろん、rg検索を毎回やり直すのは負担が大きいこともあるので、自分は端末で結果を分析して、必要ならtmuxのカスタムコマンドで最後のコマンドの出力をコピーしてvimに送る、という形で使っている。そのときはプロンプトにUnicode文字を活用するトリックを使うこともあるし、tmux saveb - | vim -c cb -で渡すこともあるvim -c cb -がVimで好きな機能だと言っていたけれど、それが何をするのか説明してもらえるだろうか。ls | vim -とls | vim -c cb -を試してみても、すぐには違いがわからなかった)vim -q <(ripgrep --vimgrep restore_tool)と同じ用途なのだろうかこのセットアップはtmux、fzf、rg、zoxide、そしてすっきりしたnvimまで入っていて見栄えがいい。もし入っていないなら、atuin、starship、bat、glow、duf、dogdns、viddy、gum/sesh、dust、btopなども勧めたい。GitHubのAwesome Terminal XYZ系のリストに全部載っている。atuinは本当に必須級で、zoxideがないなら、アスリートなのに靴が合っていない感じだ。端末の動画を撮るならasciinemaの方がよい選択だ。実際、昔はこういうセットアップのことを「プログラマー」と呼んでいた。今はVSCode、Zed、Cursorのようなツールも必須で、どのLLMに何を任せるべきかも把握していないといけない。こうしたツールは今や新しい「最低限」ではあるが、既存の環境を置き換えるものではない。Claude Codeやgptelをどれだけうまく使っても、時にはツリーを壊すこともあるし、magitなしでgitを使うなんて想像できない。もしCursorの素の状態でOPより速いと思うなら、その人にはLLMを実戦で使っている動画を一度撮ってみてほしい
すべてのvim/tmuxユーザーは、半分バグっているけれど高速な非公式の「エミュレーションEmacs」を自作している可能性が高い
:Termを動かしている彼はWindowsでtmuxを使うと言っているが、実際にはどう使っているのか気になる。説明できる人がいるといいのだが
こういうワークフロー共有のやり方が本当に好きだ。対象読者にぴったり合っている。動画に音があればよかったとは思うが、あとでアクションリストを読むのも悪くなかった。自分のワークフローにも参考になる点があって学びがあった。tmuxの難解なキーボードショートカットに触れていたが、ここでbyobuを使ったことがある人はいるだろうか。byobuはtmuxのラッパーで、ほとんどのコマンドをF#キーに割り当てている。10年前に初めて触れて以来、ずっと使っている。その前の数年は純粋なtmuxだけを使っていた
ctrl-kがプレフィクスで、hは「左のペインを選択」のデフォルトではない。byobuは使ったことがないが、説明を聞く限りではデフォルトショートカットを少し便利にした程度のようなので、あまり追加で載せたいとは思わないこういう形なら、自前の巨大な正規表現がなくてもtmuxプラグインでコピーモード機能などを拡張できる。tmux-fpp、tmux-copycat、tmux-fingers、tmux-urlview などがある。速度面では内蔵機能にできるだけ依存した方が有利かもしれないので参考までに。自分は特にtmux-resurrect(セッション保存/復元)、tmux-continuum(自動化機能)、Oh-My-Fish向けのtmux-zenもとても気に入っている。tmux-resurrect、tmux-continuum、tmux-zen を紹介したい。格好いいtmux環境の構築は思ったより本当に簡単だという点も強調したい
:をうまく拾えず、b) copycatは独自のビューア抽象化を使っているため、1回の検索で実行できるアクションが1つしかない。自分の方法はtmuxの内蔵検索を再利用しているので、ハイライトされたファイルに対して好きなアクションを自由にバインドできる。多くのプラグインがコピー/ペーストしかサポートしないか独自モードを上に載せる理由も、tmuxがハイライト制御をほぼ内蔵検索でしかできないからだこういうセットアップは本当に美しい。なのに、まともなAIのタイプアヘッドがまだターミナルに現れていないのは不思議だ。Cursor Tabがまさに合いそうなのに、ターミナルへの適用ができていない。暫定的には、ターミナル出力を偽のファイルにパイプしてcursorに送る製品をさっと作りたくなる
記事のタイトルは実際には "How I use my terminal" だ