MacとWindowsでターミナル設定を完全統一。WezTermで構築するクロスプラットフォーム環境の実践レシピ
目次
開閉
会社支給のMacBook Proで日中の業務をこなし、自宅ではWindowsノートPCを開いて個人開発や検証を行う。
そんな日常を送っていると、地味ながら確実に思考の足を引っ張るのが「ターミナル環境の分裂」です。
MacではiTerm2やGhostty、WindowsではWindows TerminalやAlacrittyと、OSごとに別のターミナルエミュレータを使っていると、以下のような摩擦が毎日のように発生します。
- 「フォントサイズや行間が微妙に違って、コードの視認性や折り返し感が狂う」
- 「ペイン分割やタブ切り替えのショートカットがOS間で一致せず、指が空振りする」
- 「設定ファイルがJSON・plist・YAMLとバラバラで、片方で整えた配色をもう片方へ移植するのが億劫になる」
このストレスを根本から断ち切るために行き着いたのが、Rust製でLua設定を採用しているターミナルエミュレータ「WezTerm」を中核にしたクロスプラットフォーム運用です。
今回は、単一の設定ファイル(wezterm.lua)をGitHubのdotfilesで同期し、MacとWindows(WSL2 / PowerShell)の両方で全く同じ手触りのターミナルを実現する実践的なアプローチをお話しします。
なぜ数ある選択肢からWezTermを選んだのか
クロスプラットフォームで動くモダンターミナルには、AlacrittyやKitty、最近注目を集めているGhosttyなど、魅力的な選択肢が揃っています。その中で私がWezTermに落ち着いた理由は、明確に3つあります。
1. 「Lua」による柔軟なOS条件分岐が書ける
AlacrittyなどのYAML/TOML形式の設定はシンプルで高速ですが、「Macの時だけこのキーマップを適用し、Windowsの時はWSL2をデフォルトシェルとして起動する」といった動的な条件分岐が設定ファイル単体では完結しづらい制約があります。
WezTermは設定ファイル自体がLuaスクリプト(wezterm.lua)であるため、OSやホスト名の判定、環境変数に応じた柔軟なロジックが1ファイルで極めて自然に記述できます。
2. WindowsとWSL2の境界線を意識させない設計
Windows環境でのターミナル利用において、WSL2(Ubuntu等)の立ち位置は特殊です。WezTermはWSL2のディストリビューションをファーストクラスで認識し、起動時のデフォルトドメインとして指定するだけで、Windowsネイティブの高速なGPU描画の恩恵を受けながら、中身は完全なLinuxシェルとしてシームレスに立ち上がります。
3. 追加プラグインなしで「ペイン分割」と「タブ」が完結する
tmuxなどのターミナルマルチプレクサを挟む手法も王道ですが、tmux自体のキーバインドやクリップボード共有(特にOS間でのコピー&ペースト)の設定保守は意外と重い作業になります。WezTermはエミュレータ単体で洗練されたタブとペイン分割を備えており、余計なレイヤーを挟まずに軽量な操作感が保てます。
graph TD
A["単一の dotfiles リポジトリ(wezterm.lua)"] --> B{"OS自動判定(target_triple)"}
B -->|"macOS (Darwin)"| C["デフォルトシェル: zsh<br>装飾: タイトルバー非表示<br>修飾キー: Cmd基軸"]
B -->|"Windows"| D["デフォルトドメイン: WSL2 (Ubuntu)<br>装飾: RESIZE統合<br>修飾キー: Alt / Ctrl基軸"]
C --> E["同一のフォント・配色・ペイン操作感"]
D --> E
1ファイルで両OSを制御する「wezterm.lua」の核
実際に私が運用している wezterm.lua の中から、OSの差異を吸収しつつ軽快さを保つためのエッセンスを抜粋してご紹介します。
local wezterm = require 'wezterm'
local config = wezterm.config_builder()
-- OS判定フラグ
local is_mac = wezterm.target_triple:find("darwin") ~= nil
local is_windows = wezterm.target_triple:find("windows") ~= nil
-- ---------------------------------------------------------
-- 1. 基本外観・フォント設計
-- ---------------------------------------------------------
config.color_scheme = 'Tokyo Night'
config.font = wezterm.font_with_fallback({
'JetBrains Mono',
'UDEV Gothic NFLG', -- 日本語フォントフォールバック
})
config.font_size = is_mac and 13.5 or 11.5
config.line_height = 1.2
-- ウィンドウの余白と透過度
config.window_padding = {
left = 12,
right = 12,
top = 10,
bottom = 8,
}
config.window_background_opacity = 0.95
-- ---------------------------------------------------------
-- 2. OS固有のシェル起動設定
-- ---------------------------------------------------------
if is_windows then
-- WindowsではWSL2(既定のディストリビューション)を直接起動
config.default_domain = 'WSL:Ubuntu'
config.window_decorations = "RESIZE"
else
-- macOSではタイトルバーを隠してミニマルに
config.window_decorations = "RESIZE"
end
-- ---------------------------------------------------------
-- 3. キーバインド(OS間の指の混乱を防ぐ共通化)
-- ---------------------------------------------------------
local act = wezterm.action
local mod_key = is_mac and 'CMD' or 'ALT'
config.keys = {
-- 水平・垂直ペイン分割
{ key = 'd', mods = mod_key, action = act.SplitHorizontal { domain = 'CurrentPaneDomain' } },
{ key = 'D', mods = mod_key .. '|SHIFT', action = act.SplitVertical { domain = 'CurrentPaneDomain' } },
-- ペイン間移動(Vim風の h / j / k / l)
{ key = 'h', mods = mod_key, action = act.ActivatePaneDirection 'Left' },
{ key = 'l', mods = mod_key, action = act.ActivatePaneDirection 'Right' },
{ key = 'k', mods = mod_key, action = act.ActivatePaneDirection 'Up' },
{ key = 'j', mods = mod_key, action = act.ActivatePaneDirection 'Down' },
-- ペインを閉じる
{ key = 'w', mods = mod_key, action = act.CloseCurrentPane { confirm = true } },
-- タブの新規作成と移動
{ key = 't', mods = mod_key, action = act.SpawnTab 'CurrentPaneDomain' },
{ key = '[', mods = mod_key, action = act.ActivateTabRelative(-1) },
{ key = ']', mods = mod_key, action = act.ActivateTabRelative(1) },
}
return config設定のポイント
-
フォントサイズの微調整: MacのRetinaディスプレイと、Windowsの一般的な高DPIディスプレイでは、同じ「12pt」でも視覚的な大きさが微妙に異なります。
is_mac and 13.5 or 11.5のように三項演算子で微調整を入れておくことで、どちらの画面を見ても同じ文字密度でコードやログと向き合えます。 -
モディファイアキーの共通変数化: Macでの最頻出キーは親指で押す
Commandですが、WindowsでCommandに相当する位置にはAltがあります。local mod_key = is_mac and 'CMD' or 'ALT'としてキー定義を抽象化しておくことで、親指を中心とした操作感を両OSで保つことができます。 -
日本語フォントのフォールバック設定: 英数字には美しく視認性の高い「JetBrains Mono」を使いつつ、日本語の全角文字が欠けないよう「UDEV Gothic」などのフォールバックを配列で明示的に繋いでおくのが文字化けや幅ズレを防ぐ鉄則です。
運用で意識している「あえて作り込まない」割り切り
クロスプラットフォーム環境を構築する際、初心者が最も陥りやすい落とし穴が「100%の完全一致を目指して設定を肥大化させること」です。
私自身、最初の数ヶ月はステータスバーの見た目やタブの配色、シェル(zsh)のプロンプトまでミリ単位で揃えようとして、設定ファイルのメンテナンスに多くの時間を溶かしてしまいました。
数年の実務運用を経て辿り着いた現在の割り切りは以下の2点です。
1. タブバーやステータスラインの装飾を欲張らない
WezTermには強力なステータスバー描画機能(CPU使用率、時計、バッテリー残量などを表示する機能)が用意されています。しかし、これらを凝りすぎるとOSごとにAPIの呼び出し差分が発生し、設定の保守コストが跳ね上がります。
作業中に本当に必要な情報は「どのリポジトリのどのブランチにいるか」だけです。そうしたコンテキスト情報はプロンプト側に任せ、ターミナルエミュレータ本体のステータス装飾は極力デフォルトに近いシンプルな状態にとどめています。
2. OS固有のシステムショートカットとは喧嘩しない
Windowsの Ctrl + C(SIGINTとコピーの重複問題)や、Macの Cmd + Space(Spotlight)など、OSがシステムレベルで予約しているキーを無理やりWezTerm側で乗っ取ろうとすると、ブラウザやエディタを触った時に強烈な違和感となって跳ね返ってきます。
「アプリ内のペイン操作は揃えるが、OS全体の流儀には素直に従う」。この境界線を引いておくことが、ストレスなく長く使い続ける最大の秘訣です。
手元で動かす環境づくりの第一歩
WezTermの最大の魅力は、ポータブルバイナリとしても動作し、設定ファイルの再読み込みが高速な点にあります。設定ファイルを保存した瞬間にホットリロードされ、再起動なしで見た目や挙動が変わる快適さは、一度味わうとなかなか手放せません。
会社と自宅でPCのOSが異なっていて、ターミナルを開くたびに指先や視界にわずかな引っかかりを覚えている方は、まずはフォントと配色、そしてペイン分割のキーバインドだけを揃えたミニマルな wezterm.lua から手元の環境を整えてみてはいかがでしょうか。