sasaryo.dev  |  blog   about

WezTermのCopy Mode・Quick Selectが便利すぎる

#terminal

ターミナルのコピー操作、地味に面倒だと思っていた

ターミナルで作業していると、出力されたテキストをコピーしたい場面が頻繁にあります。エラーメッセージ、ログに出てきたファイルパス、curlで返ってきたURL。最近ではClaude Codeのようなターミナル上で動くAIツールが提案してきたコードやコマンドをコピーしたい、という場面も増えました。

ただ、このコピー操作が地味にストレスでした。

WezTermにはこの不便さを解消する機能が組み込まれています。この記事では、WezTermの”読む・探す・コピーする”まわりの機能を紹介します。

WezTermには「モード」がある

WezTermはRust製のターミナルエミュレータです。GPU アクセラレーション、Luaベースの設定ファイル、クロスプラットフォーム対応など特徴はいろいろありますが、個人的に一番気に入っているのはテキスト操作のためのモードが充実している点です。

WezTermには3つのモードがあります。

モード起動キーできること
Copy ModeCtrl-Shift-XVimライクなカーソル移動でスクロールバックを読む・選択・コピー
Search ModeCtrl-Shift-Fスクロールバック全体をインクリメンタル検索
Quick SelectCtrl-Shift-SpaceURL・パス・ハッシュなどを自動認識し、1キーでコピー

通常のターミナル操作(コマンド入力)は「Normal Mode」にあたります。各モードに入ると、キー入力がそのモード専用の操作に切り替わる。Vimのモード概念に近い感覚です。

Copy Mode:キーボードだけでスクロールバックを読む

Ctrl-Shift-X でCopy Modeに入ります。

Copy Modeに入ると、ターミナルの出力をキーボードだけで自由に動き回れるようになります。カーソル移動はVimとほぼ同じです。

キー動作
h j k l左・下・上・右に移動
w / b単語単位で前方・後方に移動
0 / $行頭・行末に移動
g / Gスクロールバックの先頭・末尾に移動
Ctrl-d / Ctrl-u半ページ下・上にスクロール
f{char} / F{char}行内で文字を前方・後方検索してジャンプ

テキストの選択も、Vimのビジュアルモードに倣っています。

キー動作
Space文字単位の選択を開始
V行単位の選択を開始
Ctrl-v矩形選択に切り替え
o選択範囲の反対端にカーソルを移動
y選択範囲をコピーしてCopy Modeを抜ける

たとえば「50行くらい前に出力されたスタックトレースをコピーしたい」という場面。Copy Modeに入って 50k で50行上に移動、V で行選択を始めて 10j で10行分選択、y でコピー。マウスに一度も触れずに完結するのが気持ちいいんです。

Escキーまたは Ctrl-C でCopy Modeを抜けられます。

Search Mode:長いログから目的の文字列を探す

Ctrl-Shift-F でSearch Modeに入ります。

Search Modeはスクロールバック全体を対象にしたインクリメンタル検索です。文字を打つたびに一致箇所がハイライトされ、リアルタイムで結果が絞り込まれていきます。

キー動作
文字入力検索パターンを入力(インクリメンタルに反映)
Enter / Ctrl-p前の一致箇所にジャンプ
Ctrl-n次の一致箇所にジャンプ
Ctrl-r検索タイプを切り替え(大文字小文字を区別する文字列 → 区別しない文字列 → 正規表現)
Ctrl-u検索パターンをクリア
EscapeSearch Modeを閉じる

Ctrl-r による検索タイプの切り替えが地味に強力です。たとえば Ctrl-r で正規表現モードに切り替えれば、error|warn のようなパターンでログを横断的に拾えます。

Search Modeで一致箇所にジャンプした後、そのままCopy Modeに移行することもできます。Enterで一致箇所に飛んだ時点で、Copy Modeのカーソルはその位置にある。そこから V で行選択して y でコピー、という流れが自然につながります。

Quick Select:URLやパスを一瞬でコピーする

Ctrl-Shift-Space でQuick Select Modeに入ります。

Quick Selectは、画面上のURL、ファイルパス、gitハッシュなどを自動で認識し、それぞれにラベル(a, s, d など)を振ってくれるモードです。あとはコピーしたいものに対応するキーを1つ押すだけ。その文字列がクリップボードに入ります。

たとえばターミナルに以下のような出力があるとします。

error: file not found: /usr/local/etc/config.yaml
see: https://example.com/docs/troubleshooting
commit: a1b2c3d4e5f6

Quick Selectを起動すると、/usr/local/etc/config.yamlhttps://example.com/docs/troubleshootinga1b2c3d4e5f6 のそれぞれにラベルが表示されます。a を押せばURLがコピーされ、s を押せばパスがコピーされる、という具合です。

デフォルトで認識されるパターンには、URL、ファイルパス、gitハッシュ、IPアドレスなどが含まれています。自分で正規表現パターンを追加することもできます。

config.quick_select_patterns = {
  '[0-9a-f]{7,40}',  -- gitハッシュ
}

さらに QuickSelectArgs を使えば、選択後のアクションをカスタマイズできます。たとえばURLを選んだら直接ブラウザで開く、といった設定も可能です。

config.keys = {
  {
    key = 'P',
    mods = 'CTRL',
    action = wezterm.action.QuickSelectArgs {
      label = 'open url',
      patterns = {
        'https?://\\S+',
      },
      action = wezterm.action_callback(function(window, pane)
        local url = window:get_selection_text_for_pane(pane)
        wezterm.open_with(url)
      end),
    },
  },
}

キーバインドは key_tables でカスタマイズできる

ここまで紹介したCopy Mode・Search Modeのキーバインドは、すべて wezterm.luakey_tables で上書きできます。

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    copy_mode = {
      { key = 'y', mods = 'NONE', action = act.Multiple {
        { CopyTo = 'ClipboardAndPrimarySelection' },
        { CopyMode = 'ScrollToBottom' },
        { CopyMode = 'Close' },
      }},
      -- Vimと同じ操作感にしたければ、デフォルトをベースに調整する
    },
    search_mode = {
      { key = 'Enter', mods = 'NONE', action = act.CopyMode 'PriorMatch' },
      { key = 'Escape', mods = 'NONE', action = act.CopyMode 'Close' },
      { key = 'n', mods = 'CTRL', action = act.CopyMode 'NextMatch' },
      { key = 'p', mods = 'CTRL', action = act.CopyMode 'PriorMatch' },
      { key = 'r', mods = 'CTRL', action = act.CopyMode 'CycleMatchType' },
    },
  },
}

key_tables はモードごとのキーマップを丸ごと定義する仕組みです。ちなみにデフォルトのキーテーブルは wezterm show-keys コマンドで確認できるので、そこから必要な部分だけ変えるのが楽でした。

どんな人に向いているか

WezTermのモード機能は、こんな人に特に刺さる気がします。

逆に、ターミナルをたまにしか使わない人や、マウス操作に不便を感じていない人には、モード切り替えの概念自体がオーバーヘッドになるかもしれません。

まとめ:WezTermは”読む・探す・コピーする”体験が強い

WezTermのCopy Mode、Search Mode、Quick Selectの3つを紹介しました。

ターミナルエミュレータ選びでは見た目やパフォーマンスが注目されがちですが、「出力されたテキストをどれだけ快適に扱えるか」も日常の作業効率に直結します。WezTermはこの部分がとても強い。私はもうマウスでのドラッグ選択には戻れない気がします。

まだCopy Modeのキーバインドも育てている途中なので、自分の手に馴染む形にカスタマイズしていきたいです。