世界を動かす技術を、日本語で。

私のターミナルの使い方

概要

  • tmux を活用したリモート開発環境の構築と、その驚きの操作フローを紹介
  • VSCode やZedへの不満から独自のワークフローを追求した経緯
  • tmux の設定や独自スクリプトによるファイル検索・編集の自動化
  • 他人にはおすすめしにくいが、 生産性と快適さ は大幅向上
  • 代替案や学び、ターミナルの本質的な強さについても解説

tmuxによるリモート開発ワークフローの全体像

  • Windows Terminal を開き、 Ctrl + Shift + 5 で新しいタブを開く操作
    • 新タブで自宅デスクトップに SSH接続 し、即座に tmux を起動
    • tmux 上でデフォルトシェルの zsh を起動
  • zsh プロンプト表示後、設定を非同期で読み込みつつ zoxide で最近使ったディレクトリをファジー検索
  • ripgrep コマンドを入力、 zsh のオートフィル機能で過去のコマンドを自動補完し Ctrl + f で確定
  • Ctrl + k f でtmuxのスクロールバック全体からファイル名を検索
    • ファイル名が青色でハイライトされ、 n キーで次々と選択
  • 目的のファイルを見つけたら o キーでデフォルトアプリ(この場合はnvim)で開く
    • tmux が新しいペインでnvimを起動し、リモート上でファイル編集
  • rust-analyzer で参照ジャンプを試みるが、一部マクロに対応できず失敗
    • 成功した箇所で参照先にジャンプ
  • Ctrl + k h でtmuxのペインフォーカスを左側に戻す
  • 再び n で次のファイルを選択、 o で同じnvimインスタンス内で別ファイルを開く
  • b キーで開いているバッファ一覧を表示し、ファイル間を素早く切り替え

なぜこのワークフローを作ったのか

  • VSCode の遅延やvimプラグインとのキーバインド競合に不満
  • Zed も未成熟かつキーバインド競合が多かった
  • ターミナル上の nvim 運用ではファイル名のコピペや整形が煩雑
  • VSCodeのCtrl+クリック のように、任意のパスを即座に開きたいニーズ
  • tmux を活用し、理想のワークフローを自作した経緯

tmuxの設定・スクリプト解説

  • スクロールバックからファイル名検索
    • 複雑な正規表現をtmuxのbind-keyで実現
    • 検索ロジックは search-regex.sh で管理
  • 選択ファイルを新しいペインでnvim起動
    • デフォルトアプリで開く場合は copy-pipe でパスをbash経由で展開しopen
    • 現ペインでエディタ起動も可能(ファイル種別によるアプリ選択)
  • nvim実行中のペインにファイルを送る
    • Perlスクリプトで tmux からnvimにコマンド送信
    • 既存nvimインスタンスへのファイル追加やペイン選択も自動化

この仕組みのメリットと注意点

  • ローカルには 高機能ターミナル不要、フォントが綺麗なら十分
  • tmux 経由の操作なので、Windows環境でも追加インストール不要
  • エディタがリモートスクリプト非対応でも運用可能(nvim/helix/kakoune等)
  • エディタ組み込みターミナルに依存せず、 柔軟性と拡張性 を確保
  • セッション永続化 が最大のメリットだったが、今後は kitty への移行も検討中
    • kittyはssh連携がシェル統合型で、リモートにインストール不要
    • weztermはサーバープロセス必須で、デフォルトで入っていない

使ってみてどうだったか

  • エディタのラグやキーバインド問題 から解放され、快適な編集環境を実現
  • デバッグも容易、vimプラグインのluaにprintを挿入するだけで挙動確認
  • エディタ・ターミナル間のスクリプト連携 が簡単
  • ただし、 他人にはおすすめしにくい
    • スクリプトが壊れやすく、自己管理できる人向け
    • デバッグや運用の知識が求められる

似たことをやりたい人向けの代替案

  • fish + zoxide + fzf :ディレクトリ移動やファイル検索の効率化
  • エディタ標準の ファジーファインドや全文検索、タブ・ウィンドウ管理
  • qf :ターミナル出力からファイル選択(ただしvi系CLI前提、カスタム要)
  • e :file:line構文変換ツール(同名自作ツールと偶然被ったエピソードも)
  • vim --remote filename, code filename, emacsclient filename :既存エディタのリモートファイルオープン
    • file:line未対応やエディタ切替時の手間が課題

学びとまとめ

  • ターミナルは想像以上に強力、スクリプト化次第で多彩な機能を実現可能
  • エディタに縛られず、 自由なワークフロー構築 が可能
  • 既存ツールでもある程度再現できるが、 本質的な柔軟性はターミナルスクリプトに軍配
  • 他の人のツール構成や工夫にも興味あり、情報交換歓迎

Hackerたちの意見

記事のタイトルは実際には「どうやってターミナルを使っているか」だよ。

これ、最初は「There Will Be Blood」のパロディかと思った。 (今のタイトルが「I use my terminal」ってのは分かるよね)

自分も投稿をざっと見たときに気づいたけど、完全なタイトルは「I use my terminal (and so should you)」って感じだね。プロターミナル投稿にプラス1! Chromebook使ってるけど、必要なのはターミナルとブラウザだけだって気づいた。Mac OSに切り替えるのはちょっと過剰な気がするし、ターミナルと、まあ、他のブラウザ以外はあんまり使わないな。

HNはタイトルの提出時に、一般的な接頭辞や接尾辞を自動で削除するよ。

これはHNの「機能」で、タイトルの最初の単語が「How」の場合はそれを削除するんだ。混乱を生む以外に何の目的もないけど、モデレーターはこれがクリックベイトを防ぐって言ってる。どうやって? 誰も知らない。

誰かが自分で書いたターミナルエミュレーターを使っているブログ記事かと思った。

こんな巨大なregexを自分で書きたくないなら、コピー・モードにこんな機能を追加する既製のtmuxプラグインがいくつかあるよ。 https://github.com/tmux-plugins/tmux-fpp https://github.com/tmux-plugins/tmux-copycat https://github.com/Morantron/tmux-fingers https://github.com/tmux-plugins/tmux-urlview ビルトインに依存する設定やプラグインはたぶん速いから、tmux-copycatについてはそれを考慮してね。あと、セッションを保存・復元してくれるtmux-resurrectも好きだし、自動でそれを実行してくれるtmux-continuum、Oh-My-Fish用のtmux-zenプラグインもいいよ! https://github.com/tmux-plugins/tmux-resurrect https://github.com/tmux-plugins/tmux-continuum https://github.com/sagebind/tmux-zen/tree/master すごくいいtmuxのセットアップが簡単にできるよ!

そうそう、元の正規表現はtmux-copycatから取ったんだ。でも、a) その正規表現は : を扱えなくて、b) copycatはペインの状態を保存・復元する上に独自の「ビューア」抽象を構築してるから、検索ごとに1つのアクションしかできないんだ。私のやり方は、通常のtmuxの設定構文を使って、ハイライトされたファイルにアクションをバインドできるようにしてる。tmuxの組み込み検索を再利用してるからね。これらのプラグインは、コピー/ペーストをサポートするか、独自の「モード」を構築するものばかりで、tmuxは組み込み検索を使わないとハイライトの制御がほとんどできないのが注意点だよ。

ブログ全体が小文字だったのが思ったより気 distracting だった。

著者自身が大文字を使いたいという本能と戦っているのが面白いね。「この動画で何が起こるか」というリストの最初の2つの項目は大文字を使ってるし。

へぇ、面白いね。全然気づかなかったわ。

これはスタイルの選択で、時々人々がこだわることだね。ポーターロビンソン(DJ)も同じことをしてて、ちょっと贅沢に感じるんだよね。

最近の子たち。90年代から2000年代初頭にオンラインで育った私たちの多くが、30年以上もそうやってきたんだ。プロになったときに多くの人がそれを捨てたと思う。ある文脈では捨てたけど、他のところではまだやってる。HNでは明らかにやらないけど、他のほとんどの場所ではやってる。大文字をスキップするのが自然なんだよね。スマホが普及する過渡期には、自動大文字をオフにするオプションがなかった時期もあったと思うし、今のようにモバイルデバイスでの自動修正の細かい制御がなかったのかもしれない。それが小文字だけの習慣を消したんじゃないかな。だからHNでは大文字と普通の句読点を使う「普通の」スタイルになったんだと思う(HN以外では段落を終える文にピリオドを使うことはあまりないけど)。

人間向けのテキストについては同意するよ。ただ、スピードを重視して、最近はLLMとやり取りする時に、大文字や句読点を省くことにしたんだ。明確さに必要な場合を除いてね。これが、AI界隈の人たちが全て小文字で書く理由かもしれないな。

書くことは「サプライズ」予算を管理することだよ。文法のルール(特定の方言や分野に応じて)を厳密に守ることでサプライズを最小限に抑えられるから、著者は興味深い部分にもっと予算を使えるし、読者もそこに集中できる。デフォルトじゃないスタイルを意図的に使うと、その特定のポイントに読者の注意を引きつけることができる。

これめっちゃ好き!ここ10年くらい、こういうワークフローを試行錯誤してきたんだ。時間が経つにつれて、カスタムレイヤーをできるだけ減らすようにしてる。だって、そういうレイヤーにはメンテナンスコストがかかるからね。標準のVim(tmuxなし)でも、この投稿で共有されているほとんどのことができるよ。rg --vimgrep restore_tool | vim -c cb - でね。(vim -c cb - はVimでの一番好きな機能なんだけど、あまり使われてないのが不思議だな。) rgの検索を再実行するのはあまり好ましくないこともあるし、Vimで開く前にターミナルで結果を分析したいことが多いんだ。だから、カスタムのtmuxコマンドを使って、最後のコマンドの出力をコピーしてるよ。[このトリックを使って、プロンプトにUnicode文字を追加する方法 https://ianthehenry.com/posts/tmux-copy-last-command/] それから、例えば tmux saveb - | vim -c cb - でVimに送ってる。

(「vim -c cb -」はVimでの私のお気に入りの機能です。あまり使われたり話題にされたりしないのが不思議です。) それが何をするのか説明してくれませんか?「ls | vim -」と「ls | vim -c cb -」を試してみたけど、すぐには違いがわからなかった。

10年前、私は巨大なマルチファイル・マルチパッケージのvim設定を捨てて、今は1年に1〜2行のずっとシンプルなvimrcを少しずつ作り上げてる。古いソフトウェアのデフォルトはほとんどいつも理由があって存在してるから、それを変える前に理解しようとするべきだと思う。

これは「vim -q <(ripgrep --vimgrep restore_tool)」と同じか似てるの?

ワークフローを共有するこの方法、すごくありがたいね。観客に合わせた内容だし。実は、動画に音があったらいいなとも思ったけど、後からアクションのリストを読むのも悪くなかったよ。自分のフローでできることやアプローチを変えられることをいくつか学んだし。tmuxの難解なキーボードショートカットについて言及してたけど、ここにいるあなたや他の人がbyobuを使ったことがあるか気になるな(byobuはtmuxのラッパーみたいなもので、ほとんどのコマンドがF#行に基づいてると思う)。10年前に教えてもらって、それ以来使ってるよ(その前の2年は原始的なtmuxを使ってたけど)。

楽しんでもらえて嬉しいよ :) わかりやすくて、なおかつサクッと読めるものを探してたんだ。> tmuxの難解なキーボードショートカットについて言及してたね。ああ、tmuxのショートカットはほぼ全部リマップしてるよ。ctrl-kはデフォルトのプレフィックスじゃないし、hは「左のペインを選択」のデフォルトキーじゃない。byobuは試したことないけど、READMEをざっと見た感じ、デフォルトのキー設定がちょっと良くなるくらいで、あまり多くは期待できないと思うし、ターミナルにレイヤーを増やしたくないな。

すべてのvim/tmuxユーザーは、アドホックで非公式に仕様が決まっていて、バグだらけで、正直言ってかなり速いEmacsの半分を実装してるよね。

vim+tmuxのセットアップは、システムのプリミティブ(パイプ、ファイル、シグナル、スクロールバック)に依存することが多いから、ツールが環境を超えて透明性を保つんだ。これがポータビリティやデバッグの面で優位性をもたらす、特にSSHや制約のあるシェルで。だから、異なる保証に基づいてワークフローが自然に形作られるし、自分のvim設定を作るのが明らかに選択肢になるんだよね。

vim/tmuxとemacsを特定のことに使ってる者として(何年もemacsだけで設定して使ってたけど)、私のemacsのセットアップは、vim+tmuxのセットアップよりもずっとアドホックで、非公式で、バグだらけだよ ;)

ターミナルのスクロールバックは、クエリ可能な状態として扱わない唯一のUIだよね。OPの設定を見ると、RGの出力やファイルパス、スタックトレース、ビルドログなど、たくさんの文脈が欠けてるのがわかる。これらはすでに雑然とした状態の中にあるのに。もしシェルが行参照や構造的タグ付けを持つスクロールバックAPIを公開したら、パスに注釈を付けたり、バッファにリンクしたり、最後の2回の実行を比較したりできる。何も再実行せずにね。そうすれば、現在のワークフローの半分の間接的な部分をカットできる。tmuxの正規表現ジャンプはハックだけど、より深いモデルを示唆してる。スクロールバックは独自のメモリレイヤーであるべきだよ。

そうそう!!ターミナルに求めるものの一つは構造化されたメタデータなんだ。それがあれば、いろんなことができるから。今は、ちょっとでも近いものを使うには、たくさんのANSIエスケープを解析しなきゃいけない。

それはttyか、ptyの向こう側にあるもの(つまり、XtermのようなVTE)でやらなきゃいけないことだよ。シェルにはそれにアクセスする権限がない。スクロールバックバッファをファイルに書き込むためのxtermコマンドがあるから、理論的には今日それを有効にするためのハックを使いたいなら、それを使ってgrep(自動化したいならxdotoolでトリガーすることもできる)を組み合わせればできるよ。

「vimやemacsでこれができる」って言ってる人がたくさんいるのを見るけど、確かにその通り。エディタでファジーファインディングやペイン/タブができる。でも、そうなると箱の中にいることになる。ターミナルとやり取りするには、専用のプラグインか、別のネストしたターミナルエミュレーター(例えば、vimの:terminal)を開かなきゃいけない。この投稿で触れられていない私のセットアップの利点の一つは、git show HEADを打つとファイル名がコマンドに入ることなんだ。これはgitだけじゃなくて、任意のコマンドでも機能する。ターミナルでメタ処理を行うからね。

はっきり言っておくけど、ターミナルからemacsを使うことはできるけど、それがデフォルトじゃないし、ほとんどの人はそうしないよ。だから、emacsで開いたターミナルエミュレーターは「ネスト」してるとは言えないね。

ちょっと厳密に言うと、tmuxを使ってるなら、もう「ボックス」にいるし、実質的には「ネストされたターミナルエミュレーター」を使ってることになるよ。EmacsやVimは、任意の文字列(同じターミナルバッファからの行で、特定の正規表現に一致するもの)を受け取って、ターミナルバッファのコマンドラインに置くことができるんだ。もっと重要なのは、そのプロセス全体をCを書くことなくカスタマイズできるってことだよ。

コンピュータを使っていると、ある種の箱の中にいるってことだよね。

「ターミナルとのやり取りには、専用のプラグインか、別のネストされたターミナルエミュレーターを開く必要がある」 それは違うよ。vimのコマンドモードで「:!git show HEAD」みたいなターミナルコマンドを実行できるし、自動補完もできるし、出力を必要なところにパイプすることもできる。今編集中のファイルから離れることなくね。コマンド内で「:!git add %」みたいに現在開いているファイルのパスを置き換えることもできるよ。

いいセットアップだね。tmuxにfzf、rg、zoxide、そして見た目がすごくクリーンなnvimが揃ってる。もし持ってなかったら、atuin、starship、bat、glow、duf、dogdns、viddy、gum/sesh、dust、btopなんかもおすすめだよ。Awesome Terminal XYZのGitHubリストには全部載ってる。atuinは超重要で、zoxideよりも大事かも。zoxideなしでコーディングするのは、違うスポーツ用の靴を履いてるアスリートみたいなもんだよ。asciinemaはターミナル動画を作るのにもっといい方法だし、今これが変だっていうのも変な話だよね。ツールをちゃんと使いこなすのが「プログラマーであること」だったのに。VSCodeやZed、Cursorみたいなものは便利な追加ツールだけど、今はそれらも頭に入れておかないといけないし、どのLLMをどう使うかも知っておかないと。これらは新しい最低限の条件であって、何かの代わりにはならない。Claude Codeが4時にPIDコントローラー全開で動いてる時でも、時々ツリーを壊しちゃうことがあるし(壊れなかったら、gptelよりも早く動かせてないってことだし)、magitなしだと厳しいよ。もしOPよりもCursorのデフォルトで早いと思ってるなら、LLMを使う方法を動画にしてもらったら?

プログラマーであることは、開発環境を設定することじゃない。昔からそうだよ。私は、exエディタを使ったUnixを好む比較的優れたプログラマーを知ってるし、理解が足りないのに派手なIDEを使ってる初心者もたくさんいる。それがツールが全く重要じゃないってわけじゃないけど、歴史的には比較的小さな要素だったんだ。もしかしたらLLMがそれを変えたのかもしれないし、変えようとしてるのかも。違うスポーツ用の靴を履いたアスリートは5%遅く走るかもしれない。それが致命的なこともあるし、金メダリストより5%遅いスプリンターはただの負け犬だ。でもほとんどのプログラマーは、コラボレーションで勝つし、比較的スムーズなフィットネスの環境でやってる。スタートアップのようなwinner-takes-allの領域でも、失敗は常に大きなエラーから生じる。誰も「Dvorakキーボードを使ってたら、私のスタートアップは成功してたのに」とか、「VSCodeの代わりにvimを使ってたら」とか言ったことはないよ。いつも、共同創業者の対立やモチベーションの喪失、プロダクトマーケットフィットを見つけられないことなんかが原因だね。

いいコマンドのリストだね。fd(著者:sharkdp)も追加したいな。これはfindの代替で、すごく使いやすいよ。それに、atuinは私のCLIにとって一番のアップグレードかも。6ヶ月前に実行したエソテリックな呪文を簡単に引き出せるのが助かる。

ツールにこだわりすぎじゃない?いい開発者は、全く「裸」の環境でも素晴らしい結果をすぐに出せるよ。確かに良いツールは助けになるかもしれないけど、改善されるのはほんの少しの部分だし、これは生産性よりも自分の楽しさに関わることが多い。もしどのIDEを使うかで価値を生み出すスピードが明らかに制限されているなら…まあ、長くてワクワクする旅が待ってるよ。それは楽しいことになるし、冗談じゃないからね。「ツールを知ること」が「プログラマーであること」とは決して呼ばれなかった。今まで一緒に働いた最高の開発者たちは、みんなmore/grep/viを使って素晴らしい仕事をして、たくさん考えてた。価値が生まれるのはその考える部分なんだよ。それは今でも変わらない、たとえLLMを混ぜてもね。

私はこう使ってるよ:

  • トップレベルのtmuxを1つ
  • 各ワークスペース用のウィンドウを持ってる
  • cscope(1)でインデックスできるコードベースごとに、ネストされたtmuxセッションを1つずつ実行してる 各ネストされたtmuxセッションのウィンドウ#0でcscopeを実行して、
  • CSCOPE_EDITORを、同じセッションの新しいウィンドウで$EDITORを起動するスクリプトに設定して、選択したファイルのベース名をタイトルにしてる
  • そのCSCOPE_EDITORスクリプトは「tmux new-window」コマンドを実行するとすぐに終了して、cscopeがフォーカスを取り戻すようにしてる これでtmux+cscopeを貧乏人のマウスなしIDEとして使えるんだ。