WezTerm 設定ファイルその後

前回の記事からWezTermの設定ファイルを更新したので、それの記録です。


完成イメージ

起動すると以下のような感じ。

  • 左ペイン: メインの作業エリア(git操作やエディタなど)
  • 右上ペイン: Claude Code
  • 右下ペイン: OpenAI Codex

設定ファイルの全体構成

.wezterm.lua は大きく分けて以下のセクションで構成しています。

  1. 基本設定
  2. フォント設定
  3. カラー・外観
  4. タブバー設定
  5. ペイン設定
  6. タブタイトルのカスタマイズ
  7. キーバインド(tmux風)
  8. 起動時レイアウト

1. 基本設定

config.automatically_reload_config = true
config.adjust_window_size_when_changing_font_size = false
config.scrollback_lines = 5000
config.window_close_confirmation = 'AlwaysPrompt'

automatically_reload_config = true にしておくと、.wezterm.lua を保存した瞬間にWezTermが設定を再読み込みしてくれます。設定をいじりながら即座に反映を確認できるので、最初に有効にしておくのがおすすめです。

window_close_confirmation = 'AlwaysPrompt' は、うっかりウィンドウを閉じてペイン全滅……という事故を防ぐための保険です。

macOS向けのOption キー設定

if is_mac then
  config.send_composed_key_when_left_alt_is_pressed = false
  config.send_composed_key_when_right_alt_is_pressed = false
end

macOSではOptionキーが特殊文字入力に使われますが、これを false にすることでOptionキーを純粋なAlt修飾キーとしてアプリに渡せるようになります。後述するClaude CodeでのShift+Enter改行を実現するために必要な設定です。

デフォルトシェル

if not is_windows then
  config.default_prog = { '/bin/bash', '-l' }
end

ログインシェルとしてbashを起動しています。macOSのデフォルトはzshですが、好みに応じて変更してください。


2. フォント設定

config.font = wezterm.font 'UDEV Gothic 35NF'
config.font_size = 15.0
config.line_height = 1.1

フォントには UDEV Gothic 35NF を使っています。何か新しいのを使用したかったので新しいのを使ってみた。それまではJetBrains MONOを使ってた。

line_height = 1.1 で行間をほんの少しだけ広げた方が自分は見やすかった。


3. カラー・外観

config.color_scheme = 'Ashes (dark) (terminal.sexy)'
config.window_background_opacity = 0.9

if is_mac then
  config.macos_window_background_blur = 20
end

config.window_background_gradient = {
  colors = { '#234272', '#8b446c', '#222222' },
  orientation = { Linear = { angle = -45.0 } },
}

カラースキームには Ashes (dark) を採用した。

カラフルなグラデーションが好きなので、せっかくだからグラデーションをやってみた。絶対に黒い方が見やすいが、この辺は自己満なのでよかろう。

window_background_opacity = 0.9macos_window_background_blur = 20 を組み合わせることで、背景がうっすら透けつつもぼかしがかけている、なんかかっこいいから。

タイトルバーとパディング

config.window_decorations = 'RESIZE'

config.window_padding = {
  left = 8, right = 8,
  top = 8, bottom = 4,
}

window_decorations = 'RESIZE' でタイトルバーを非表示にし、ウィンドウのリサイズだけを許可しています。


4. タブバー設定

config.use_fancy_tab_bar = true
config.show_tab_index_in_tab_bar = true
config.hide_tab_bar_if_only_one_tab = false
config.tab_max_width = 32

use_fancy_tab_bar = true でネイティブ風のタブバーを有効にしています。


5. ペイン設定

config.inactive_pane_hsb = {
  saturation = 0.8,
  brightness = 0.6,
}

ここが地味に便利な設定です。非アクティブなペインの彩度と輝度を下げることで、今フォーカスしているペインがどれなのかを視覚的にはっきり区別できるらしいです。

Quick Select の拡張

config.quick_select_patterns = {
  'https?://\\S+',
  '[\\w._%+-]+@[\\w.-]+\\.[A-Za-z]{2,}',
  '\\b[0-9a-f]{7,40}\\b',
}

Quick Select(Leader + o)で選択できるパターンを拡張しています。URL、メールアドレス、Gitのコミットハッシュをターミナル上で即座に選択・コピーできるようになるらしいです。


6. タブタイトルのカスタマイズ

wezterm.on('format-tab-title', function(tab)
  local pane = tab.active_pane
  -- ... (パスからディレクトリ名を取得)
  -- ... (フォアグラウンドプロセス名を取得)

  local title = dir ~= '' and dir or 'shell'
  if process ~= '' and process ~= 'bash' and process ~= 'zsh' ... then
    title = process .. ' | ' .. title
  end

  local index = tab.tab_index + 1
  return string.format(' %d: %s ', index, title)
end)

タブのタイトルを「番号: ディレクトリ名」の形式にカスタマイズしています。bash/zsh/fishなどのシェル自体は表示せず、vim やnodeなど特定のプロセスが動いているときだけ「プロセス名 | ディレクトリ名」と表示する。


7. キーバインド

矢印で移動にしたかったんだけど、それはそれで何かとぶつかりそうだったので、hjklを踏襲した

Leaderキー

config.leader = { key = 'b', mods = 'CTRL', timeout_milliseconds = 1000 }

tmuxのデフォルトと同じ Ctrl+b をLeaderキーに設定しています。

ペイン操作

キー動作
Leader + v左右分割
Leader + s上下分割
Leader + h/j/k/lペイン移動(Vim風)
Leader + 矢印キーペインサイズ変更
Leader + zペインズーム(最大化/復帰)
Leader + xペインを閉じる

タブ操作

キー動作
Leader + c新規タブ
Leader + n / p次/前のタブ
Leader + 1〜5タブ番号で直接移動

その他

キー動作
Leader + f検索
Leader + oQuick Select

Shift+Enter → Alt+Enter 変換

{ key = 'Enter', mods = 'SHIFT', action = act.SendKey { key = 'Enter', mods = 'ALT' } },

これは Claude を使ってると、結構な頻度で間違ったエンターになってしまうので、この設定は自分的にはできて結構よかった。ClaudeCodeもCodexもShift +Enterで改行できるのが熱い。


8. 起動時レイアウト

wezterm.on('gui-startup', function(cmd)
  local _tab, left_pane = wezterm.mux.spawn_window(cmd or {})

  local right_pane = left_pane:split {
    direction = 'Right',
    size = 0.5,
  }

  right_pane:split {
    direction = 'Bottom',
    size = 0.5,
  }

  left_pane:activate()
end)

WezTermの起動時にイベントフックで自動的にペインを分割しています。

┌────────┬────────┐
│        │ Claude │
│  作業  ├────────┤
│        │ Codex  │
└────────┴────────┘

左半分がメインの作業ペイン、右上にClaude Code、右下にOpenAI Codexを配置する想定です。left_pane:activate() で起動直後のフォーカスを左の作業ペインに合わせています。

AIコーディングツールを2つ並べて使えるこのレイアウトは、片方に質問を投げつつもう片方でコードレビューを走らせる、といった使い方ができる。


まとめ

WezTermはLuaスクリプト一枚でターミナルの挙動をかなり細かく制御できますね。最新の設定ファイルはGitHubのdotfilesリポジトリで管理している。