【WezTerm】Windows で Claude Code 用のターミナルソフトは WezTerm がおすすめ

Mac には tmux や Ghostty といった魅力的なターミナルソフトがあり、技術記事でもよく取り上げられています。一方で Windows ではそれらが使えない ため、「いいターミナルないかな…」と探していました。

暗い机に3台のキーボードが並び、中央の1台に手が置かれている写真
道具は、自分の手に合うかどうかで選ぶ

標準の PowerShell でもいいのですが、カスタマイズの幅がほぼなく、自分好みに育てていけるものが欲しかったんです。

ネットを漁っていたところ、WezTerm が初心者にも扱いやすいという記事を発見。実際に使ってみたら期待以上だったので、Claude Code との組み合わせを前提に、おすすめのカスタマイズを紹介します。

目次

WezTerm が手軽な理由

使い始めるまでは本当に簡単です。

  • 公式サイトから インストーラを落として実行するだけ
  • カスタマイズは Lua 形式の設定ファイル に書き込むだけ
  • Claude Code に「こういうカスタマイズを設定して」と頼めば、Claude Code が Lua の設定ファイルに直接書き込んで くれる

設定ファイルの記法を覚えなくても、自然言語で「ここをこうしたい」と指示するだけで反映できるのが、Claude Code との相性の良さを実感するポイントでした。

設定は %USERPROFILE%\.wezterm.lua という1ファイルに書きます。手元で動かしている実物から、このあと紹介するカスタマイズに関係する部分を抜粋するとこうなります。検証環境は WezTerm 20260117-154428-05343b38(Windows 11)です。

-- %USERPROFILE%\.wezterm.lua
local wezterm = require 'wezterm'
local config = wezterm.config_builder()

-- 既定のシェルを PowerShell 7 に(-NoLogo で起動バナーを消す)
config.default_prog = { 'pwsh.exe', '-NoLogo' }

-- 日本語入力
config.use_ime = true

-- 背景の透過(0.0 = 完全透明 ~ 1.0 = 不透明)
config.window_background_opacity = 0.8

-- フォント。第1候補に無い文字は第2候補で描画される
config.font = wezterm.font_with_fallback({
  'UDEV Gothic 35LG',  -- 別途インストールが必要
  'Segoe UI Emoji',    -- Windows標準の絵文字
})

-- タブ/ウィンドウを閉じるときの確認を出さない
config.window_close_confirmation = 'NeverPrompt'
config.skip_close_confirmation_for_processes_named = {
  'pwsh.exe', 'powershell.exe', 'cmd.exe', 'wsl.exe',
  'bash', 'sh', 'zsh', 'node.exe', 'claude.exe', 'python.exe',
}

return config

おすすめのカスタマイズ

1. フォントの変更

私は UDEV Gothic 35LG を使っています。日本語と英数字のバランスが良く、ターミナル用フォントとして読みやすいです。

font_with_fallback は第1候補に無い文字だけを第2候補で描画する指定です。UDEV Gothic には絵文字が入っていないので、絵文字だけ Segoe UI Emoji に逃がしています。1つのフォントで全部まかなおうとすると、どこかで豆腐(□)が出ます。

2. 背景透過を 0.8 に設定

後ろのドキュメントや画面を見ながらプロンプトを打つときに便利。完全透過ではなく 0.8 程度の半透過 が視認性とのバランスが取れます。

3. タブ終了時の確認メッセージを OFF

毎回出てくる「本当に閉じますか?」の確認をオフにして余計な手間をなくします。

4. タブ ⇔ ペインの相互変換

  • 全タブを 1 タブに集約
    一覧して全体を見渡したいとき
  • 1 タブ内の複数ペインをタブに分割
    個別ペインを大きな画面で操作したいとき

用途に応じて切り替えられるのが想像以上に快適です。Claude Code で複数エージェントを並列で動かしているときに重宝します。

5. キーバインド設定

config.keys に設定している割り当ては以下の通りです。

キー動作
Shift + EnterESC[13;2u 送信(Claude Code 等で改行用)
Ctrl + Shift + Enter同上
Ctrl + Vクリップボードから貼り付け
Ctrl + C選択あり → コピー / 選択なし → 通常の Ctrl+C 送信(コールバックで分岐)
Ctrl + Shift + |縦分割(横並びペイン)
Ctrl + Shift + _横分割(縦並びペイン)
Ctrl + Shift + Wペインを閉じる(確認なし)
Ctrl + Shift + Qタブを閉じる(確認なし)
Alt + ↑ / ↓1 ページスクロール
Alt + Shift + ↑ / ↓1 行スクロール
Ctrl + Shift + Mペイン選択して新規タブへ移動(PaneSelect MoveToNewTab)
Ctrl + Shift + Alt + T全ペインをタブに展開(上記イベント発火)
Ctrl + Shift + Alt + M全タブを 1 タブに集約(上記イベント発火)

表のうち、Ctrl + C だけは他と性質が違います。単純な割り当てではなく、Lua のコールバックで分岐させています。

config.keys = {
  -- Shift + Enter でプロンプト内改行(Claude Code が受け取る形式で送る)
  { key = 'Enter', mods = 'SHIFT',
    action = wezterm.action.SendString('\x1b[13;2u') },

  -- Ctrl+C は「選択があればコピー / なければ本来の Ctrl+C」で分岐させる
  { key = 'c', mods = 'CTRL', action = wezterm.action_callback(function(window, pane)
      local sel = window:get_selection_text_for_pane(pane)
      if string.len(sel) ~= 0 then
        window:perform_action(wezterm.action.CopyTo('ClipboardAndPrimarySelection'), pane)
      else
        window:perform_action(wezterm.action.SendKey{ key = 'c', mods = 'CTRL' }, pane)
      end
    end) },

  { key = 'v', mods = 'CTRL', action = wezterm.action.PasteFrom 'Clipboard' },
}

ターミナルの Ctrl + C は本来「実行中のプロセスに割り込む」キーです。ここをコピーに潰してしまうと、暴走したコマンドを止められなくなります。選択があるときだけコピー、無ければ本来の割り込みにしておくと、Windows の感覚のまま使えて事故もありません。

6. スクロールバックを増やす

Claude Code と組み合わせるなら、いちばん効いたのがこれでした。

-- 既定は 3500 行しかなく、Claude Code の出力はすぐ超えて履歴が捨てられる
config.scrollback_lines = 100000

WezTerm の既定のスクロールバックは 3,500 行です。普通にコマンドを打っている分には十分ですが、Claude Code のように出力が長いツールだと、少し作業しただけで先頭が捨てられます。「さっき出ていたエラーをもう一度見たい」ができないのは地味に困ります。

100,000 行にしても体感の重さは変わりませんでした。透過やスクロールバーの設定とは無関係なので、そのあたりをコメントアウトするときに巻き添えにしないよう注意してください(私は一度やりました)。

7. ステータスラインに Git の差分を出す

タブバーの右端に、いま居るリポジトリのブランチ名と差分件数を常時出しています。

WezTermのタブバー右端にブランチ名と差分件数が出ている画面と、git呼び出し回数を直す前後で比べた表
右上の M:3f/+128/-24 が未ステージ、S が ステージ済み、? が未追跡。下は git の呼び出し回数と異常終了の記録

便利なのですが、2026年4月から9月にかけて WezTerm が6回、プロセスごと落ちました(例外コード 0xc0000409)。作業中にウィンドウごと消えるタイプの落ち方です。Windows のイベントログに残っていた記録がこれです。

# Windows のイベントログから、WezTerm の異常終了だけを拾う
Get-WinEvent -FilterHashtable @{ LogName = 'Application'; ProviderName = 'Application Error' } |
  Where-Object { $_.Message -match 'wezterm' } |
  Sort-Object TimeCreated

# 結果(日時・プロセス名・例外コードを抜き出したもの)
2026-04-28 18:28  wezterm-gui.exe  0xc0000409
2026-06-28 17:11  wezterm-gui.exe  0xc0000409
2026-07-25 21:03  wezterm-gui.exe  0xc0000409
2026-08-15 22:25  wezterm-gui.exe  0xc0000409
2026-09-04 12:27  wezterm-gui.exe  0xc0000409
2026-09-04 12:29  wezterm-gui.exe  0xc0000409

原因:GUIスレッドから同期的に子プロセスを起こしていた

ステータスラインの更新に使っていた wezterm.run_child_process には、2つの性質があります。

  • GUIスレッドを同期的にブロックする
    git コマンドが返るまで描画が止まる
  • この呼び出しの中で Rust 側が panic すると、Lua(C)のスタックを巻き戻せない
    結果として WezTerm がプロセスごと abort する

再描画のたびに git を4回叩いていたので、踏む確率がそれだけ高かった、という話です。

対策:呼び出す回数そのものを減らす

panic 自体はこちらでは直せないので、呼び出し回数を減らす方向で対処しました。やったことは3つです。

  1. リポジトリ判定を git にやらせない
    .git を自前で上に辿って探す。wezterm.glob は子プロセスを起こさないので、リポジトリの外にいる間は呼び出し0回になる
  2. 結果をキャッシュする
    同じリポジトリ内では5秒に1回だけ実行し、それ以外は前回の描画済み文字列を使い回す
  3. コマンドを4本から3本に減らす
    ブランチ名と未追跡ファイル数は git status --porcelain=v2 --branch --untracked-files=all の1本にまとめられる
-- cwd から上に辿って .git を探す。子プロセスは1つも起こさない
local function find_repo_root(dir)
  local d = dir
  for _ = 1, 64 do
    if d == '' or d:match('^%a:$') then return nil end
    local ok, hits = pcall(wezterm.glob, glob_escape(d) .. '/.git')
    if ok and hits and #hits > 0 then return d end
    local parent = d:match('^(.*)/[^/]+$')
    if not parent or parent == d then return nil end
    d = parent
  end
  return nil
end
local GIT_REFRESH_SECONDS = 5
local git_cache = {}   -- [repo_root] = { at = 秒, text = 描画済み文字列 }

wezterm.on('update-right-status', function(window, pane)
  local cwd = normalize_path((pane:get_current_working_dir() or {}).file_path or '')
  if cwd == '' then return end

  -- ここまでは子プロセスを一切起こさない
  local root = find_repo_root(cwd)
  if not root then window:set_right_status('') return end

  local now = os.time()
  local entry = git_cache[root]
  if not entry or (now - entry.at) >= GIT_REFRESH_SECONDS then
    entry = { at = now, text = build_status(root) }
    git_cache[root] = entry
  end
  window:set_right_status(entry.text)
end)

設定ファイルにも「ここを緩めると再発する」とコメントを残しました。半年後の自分は絶対に理由を忘れているので、Lua ファイルであっても、なぜその形なのかは書いておいたほうがいいです。

対策を入れたのは9月5日で、9月10日の時点ではそれ以降一度も落ちていません。ただ、それまでも数週間おきの頻度だったので、効いたかどうかはもう少し様子を見ないと言えません。

git は –no-optional-locks で呼ぶ

git を呼ぶときは --no-optional-locks を付けています。ステータス表示のような読むだけの用途で .git/index.lock を触らせないためで、これを付けないと、裏で走っている別の git 操作と競合することがあります。

知っておくと得する小ワザ

Alt + マウスドラッグで矩形選択

Claude Code に教えてもらった実行コマンドをコピペすることはよくあると思いますが、そのとき Alt を押しながらマウスで矩形選択 するのがおすすめです。

先頭の余計なスペースや行末のスペースなどを排除してコピーできるので、そのままペーストして実行 できます。地味ですが、毎回手で整形しなくていいのが快適です。

Shift + Enter でプロンプト内改行

長めのプロンプトを書くとき、Shift + Enter で改行 できるのも嬉しいポイント。一気に送信せず、見やすく整えてから Enter で送れます。

まとめ

Windows で Claude Code を快適に使いたいなら、WezTerm はかなりおすすめ です。

  • インストールが簡単
  • Lua で柔軟にカスタマイズでき、Claude Code に設定変更も任せられる
  • 背景透過、タブ/ペイン管理、キーバインドなど細部まで自分仕様にできる
  • Claude Code と使うなら、スクロールバックを増やしておく
    既定の3,500行ではすぐに履歴が消える
  • ステータスラインで外部コマンドを呼ぶなら、回数を絞る
    GUI スレッドを止め、WezTerm ごと落ちる原因になり得る

Windows のターミナルソフトで悩んでいる方は、ぜひ一度試してみてください。

今は Claude デスクトップの Claude Code を使っています(2026年9月)
このあと、Claude Code 用に専用のエディタが欲しくなって Windows で使えるものを探し、今は公式の Claude デスクトップに入っている Claude Code を使っています。探した経緯と決め手は「Claude Codeの実行環境はClaudeデスクトップに落ち着いた」にまとめました。ターミナルで使い続けたい場合は、この記事の WezTerm も引き続きおすすめです。

次に読む記事

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

わどこんのアバター わどこん

実務12年のバックエンド・インフラエンジニア。バックエンド開発からクラウド・インフラの設計・構築・運用まで担当しています。主要言語は Java・Kotlin・PHP・Python。運用の現場で拾った知見を、再現できる手順に落として残すのがこのブログのテーマです。

目次