Win11でWezTermの設定をした話

はじめに・背景

普段は業務でWindows 11を使って開発しているんですが、最近GitHub Copilot CLIがプレビューから一般提供されたこともあって、改めてターミナル環境を見直したくなった。

これまではずっとWindows Terminalを使っていたものの、「もっとマルチプラットフォームで動いて、軽量なターミナルエミュレーターってないか?」と思うように。シンプルで自分好みにカスタマイズできるターミナルを探していたところ、YouTubeでたまたま紹介されていたWezTermを見かけてこれを使ってみるかと決めた。

モテるターミナル環境的なやつだったと思う。

この記事ではWindows 11環境に特化した内容にはなるが、自分への備忘録も兼ねてWezTermの導入と初期設定の方法をまとめておこうと思います。

現状の課題・分析:なぜWezTermを選んだのか?

選定理由

  • 動作がサクサクで軽量: 毎日起動してずっと立ち上げっぱなしにするツールなので、もたつきがない軽快さであること。
  • Luaでとことんカスタマイズできる: 設定を自分の状況に合わせて変更できること。
  • ある程度人気で情報が見つかりやすい: マニアックすぎるツールだと、いざ設定で困った時に解決策が見つからなくて詰むので、参考になる記事や設定例(Dotfilesなど)がたくさん転がっていること。

Win11への導入とおすすめ設定

具体的にWindows 11環境へ導入し、設定していく手順をご紹介する。

1. インストール手順

Windows 11の場合、wingetを使うのが一番簡単。管理者権限のPowerShellやコマンドプロンプトで以下のコマンドを実行します。

winget install wez.wezterm

インストールが完了したら、スタートメニューから「WezTerm」を起動できる。最初はビックリするぐらい何もない。

2. 設定ファイル (wezterm.lua) の作成

設定ファイルを作成する。

Windowsの場合、設定ファイルはユーザーディレクトリの直下(C:\Users\あなたのユーザー名)に .wezterm.lua という名前で作成します。

  • .config/wezterm/wezterm.lua

現状下記設定を記載、細かい周辺ツールやPowerShellの設定等は割愛します。

local wezterm = require("wezterm")
local config = {}

if wezterm.config_builder then
  config = wezterm.config_builder()
end

-------------------------------------------------------------------------
-- 【1. 外観・デザインの設定】
-------------------------------------------------------------------------
config.window_background_opacity = 0.95
config.color_scheme = 'Kanagawa (Gogh)'
config.font = wezterm.font("HackGen35Nerd Console")
config.font_size = 10.0
config.window_decorations = "RESIZE" 
config.hide_tab_bar_if_only_one_tab = false
config.enable_scroll_bar = true
config.default_cursor_style = 'BlinkingUnderline'
config.use_ime = true

-- ★ ウィンドウ周りに余白を作り、視認性を高める
config.window_padding = { left = 12, right = 12, top = 10, bottom = 10 }
-- ★ QuickSelectの文字をホームポジション優先にする
config.quick_select_alphabet = 'asdfghjklweruiop'

-------------------------------------------------------------------------
-- 【2. 右上ステータスバー:Leader状態可視化版】
-------------------------------------------------------------------------
wezterm.on('update-right-status', function(window, pane)
  local days = { "日", "月", "火", "水", "木", "金", "土" }
  local day_idx = tonumber(os.date("%w")) + 1
  local day_of_week = days[day_idx]
  local date = wezterm.strftime('%Y/%m/%d')
  local time = wezterm.strftime('%H:%M')

  -- ★ Leaderキーがアクティブなら【LDR】と表示
  local leader = ""
  if window:leader_is_active() then
    leader = '【LDR】 '
  end

  window:set_right_status(wezterm.format({
    {Foreground = {Color = '#E6C384'}}, -- Leader状態は目立つ色に
    {Text = leader},
    {Foreground = {AnsiColor = 'Aqua'}},
    {Text = wezterm.nerdfonts.md_clock .. "  "},
    {Foreground = {AnsiColor = 'White'}},
    {Text = date .. "(" .. day_of_week .. ") " .. time .. " "},
  }))
end)

-------------------------------------------------------------------------
-- 【3. 基本システム設定】
-------------------------------------------------------------------------
config.default_prog = { 'pwsh.exe', '-NoLogo' }
config.scrollback_lines = 10000
config.audible_bell = "Disabled"
config.hyperlink_rules = wezterm.default_hyperlink_rules()

-------------------------------------------------------------------------
-- 【4. キーバインド:Corne v4 & Vim操作を極める】
-------------------------------------------------------------------------
config.leader = { key = 'x', mods = 'CTRL', timeout_milliseconds = 1000 }

config.keys = {
  { key = 'P', mods = 'CTRL|SHIFT', action = wezterm.action.ActivateCommandPalette },
  { key = 'f', mods = 'CTRL|SHIFT', action = wezterm.action.Search { CaseInSensitiveString = "" } },

  -- AI対策
  { key = 'Enter', mods = 'SHIFT', action = wezterm.action.SendString('\x1b[13;2u') },
  { key = 'Enter', mods = 'CTRL|SHIFT', action = wezterm.action.SendString('\x1b[13;2u') },

  -- [ペイン移動] Vimキーバインド (h, j, k, l)
  { key = 'h', mods = 'LEADER', action = wezterm.action.ActivatePaneDirection 'Left' },
  { key = 'j', mods = 'LEADER', action = wezterm.action.ActivatePaneDirection 'Down' },
  { key = 'k', mods = 'LEADER', action = wezterm.action.ActivatePaneDirection 'Up' },
  { key = 'l', mods = 'LEADER', action = wezterm.action.ActivatePaneDirection 'Right' },

  -- ★ [ペインリサイズ] Leader + 大文字 H, J, K, L
  { key = 'H', mods = 'LEADER', action = wezterm.action.AdjustPaneSize { 'Left', 5 } },
  { key = 'J', mods = 'LEADER', action = wezterm.action.AdjustPaneSize { 'Down', 5 } },
  { key = 'K', mods = 'LEADER', action = wezterm.action.AdjustPaneSize { 'Up', 5 } },
  { key = 'L', mods = 'LEADER', action = wezterm.action.AdjustPaneSize { 'Right', 5 } },

  -- ★ [ページ送り] Alt + j/k で高速スクロール(AI出力を追うのに便利)
  { key = 'j', mods = 'ALT', action = wezterm.action.ScrollByPage(0.5) },
  { key = 'k', mods = 'ALT', action = wezterm.action.ScrollByPage(-0.5) },

  -- [ペイン管理] 
  { key = '2', mods = 'LEADER', action = wezterm.action.SplitVertical { domain = 'CurrentPaneDomain' } },
  { key = '3', mods = 'LEADER', action = wezterm.action.SplitHorizontal { domain = 'CurrentPaneDomain' } },
  { key = '0', mods = 'LEADER', action = wezterm.action.CloseCurrentPane { confirm = true } },
  { key = '1', mods = 'LEADER', action = wezterm.action.TogglePaneZoomState },

  -- [タブ操作]
  { key = 'c', mods = 'LEADER', action = wezterm.action.SpawnTab 'CurrentPaneDomain' },
  { key = 'n', mods = 'LEADER', action = wezterm.action.ActivateTabRelative(1) },
  { key = 'p', mods = 'LEADER', action = wezterm.action.ActivateTabRelative(-1) },
  {
    key = 'r',
    mods = 'LEADER',
    action = wezterm.action.PromptInputLine {
      description = 'Rename Tab',
      action = wezterm.action_callback(function(window, pane, line)
        if line then window:active_tab():set_title(line) end
      end),
    },
  },

  -- [特殊操作] 
  { key = 'f', mods = 'LEADER', action = wezterm.action.ToggleFullScreen },
  { key = 'Space', mods = 'LEADER', action = wezterm.action.QuickSelect },
  { key = '[', mods = 'LEADER', action = wezterm.action.ActivateCopyMode },
}

-------------------------------------------------------------------------
-- 【5. 起動時フルスクリーン化】
-------------------------------------------------------------------------
wezterm.on('gui-startup', function(spawn_info)
  local _, _, window = wezterm.mux.spawn_window(spawn_info or {})
  window:gui_window():toggle_fullscreen()
end)

return config

見た目の拡張 (Starshipの導入)

ターミナルのプロンプト(入力行の左側の表示)をより見やすくリッチにするために、Starshipも合わせて導入します。
まずは以下のコマンドでStarship本体をインストールします。

winget install Starship.Starship

インストール後、PowerShellの起動時にStarshipを読み込ませるための設定を行います。
ターミナル上で以下のコマンドを実行し、PowerShellのプロファイル(設定ファイル)をメモ帳で開きます。

notepad $PROFILE

開いたメモ帳の一番最後に、以下の1行を追記して保存する。

Invoke-Expression (&starship init powershell)

これでWezTerm(PowerShell)を開き直せば、綺麗に装飾されたプロンプトが表示される。

今後のアクション

いかに開発業務を楽しく・効率的にできるか?AIエージェントを活用しながら出来るか?を確認しながらターミナルを使っていく。
想定では複数プロジェクトをタブで管理し、その中で複数ペインによる複数の並列作業を行いたい。

コメント

タイトルとURLをコピーしました