WezTermを起動時に
画面右半分へ配置する方法

WezTermには起動時に右半分へ配置する設定項目がありません1
Lua設定でイベントフックを使います。

local wezterm = require 'wezterm'
local mux = wezterm.mux

wezterm.on('gui-startup', function(cmd)
  local screen = wezterm.gui.screens().main
  local half_w = math.floor(screen.width / 2)
  local h = screen.height

  local tab, pane, win = mux.spawn_window(cmd or {})
  local gui = win:gui_window()

  gui:set_position(screen.x + half_w, screen.y)
  gui:set_inner_size(half_w, h)
end)Code language: PHP (php)

set_inner_sizeはピクセル単位で指定します2
タイトルバーを除いた内側の描画領域を直接制御するため、狙ったサイズになります。

関連記事

1. MUX層とGUI層

WezTermは二層構造です3
MUX層が端末を管理し、GUI層が表示を担当します。

spawn_windowはMUX層のAPIで、文字数ベースで動きます。
gui_window()を取得してからset_inner_sizeを呼ぶと、macOSのウィンドウへ直接ピクセル指定できます4
GUI層で上書きするため、initial_colsinitial_rowsを設定していても影響を受けにくくなります。

2. つまずきやすい罠

反対に、spawn_windowwidthheightを直接使うと失敗します5

この値はピクセルではなく文字数を指定するためです。
画面幅をscreen.widthで取得してそのまま渡しても、端末の列数として解釈されます。
意図したサイズになりません6

サイズが戻る場合はinitial_colsinitial_rowsをコメントアウトしてください7
これらの設定が起動後の再計算を引き起こすことがあります。
タイミング問題ならwezterm.time.call_afterで少し遅延させてset_inner_sizeを再実行すると安定します8

  1. WezTermはRustで実装されたクロスプラットフォームの端末エミュレータで、Lua設定ファイル(~/.wezterm.luaまたは~/.config/wezterm/wezterm.lua)で動作をカスタマイズします – WezTerm Documentation
  2. set_inner_size(width, height)は「ウィンドウ装飾を除いた内側の領域をピクセル単位でリサイズする」と公式で定義されています – set_inner_size – WezTerm
  3. WezTermのアーキテクチャは、端末セッションを管理するMultiplexer層と表示を担当するGUI層に分かれています。この設計により、ヘッドレス運用やリモート接続が可能になります – wezterm.mux module
  4. gui_window()はMuxWindowオブジェクトからGUIウィンドウオブジェクトを取得するメソッドです。これにより、MUX層からGUI層の操作が可能になります – gui_window – WezTerm
  5. 公式ドキュメントでは「width and heightはcolumn and row cellsの数を指定する」と明記されています。ピクセル単位ではありません – spawn_window – WezTerm
  6. ウィンドウの中央配置やサイズ指定については、コミュニティでも多くの議論があります。この手法は複数のユーザーによって検証されています – How to center a new window on the screen? – Discussion #5501
  7. LinuxのX11やGNOME環境では、set_inner_sizeで設定したサイズがinitial_colsinitial_rowsに戻される既知の問題が報告されています – Issue #6757 – wezterm/wezterm
  8. wezterm.time.call_after(seconds, callback)は指定秒数後にコールバックを実行する関数です。バージョン20230320以降では小数点も受け付けます – wezterm.time module