diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx index ea742f699708..27fb64d88214 100644 --- a/packages/opencode/src/cli/cmd/tui/app.tsx +++ b/packages/opencode/src/cli/cmd/tui/app.tsx @@ -74,6 +74,7 @@ function rendererConfig(_config: TuiConfig.Info): CliRendererConfig { return { externalOutputMode: "passthrough", targetFps: 60, + widthMethod: _config.width_method, gatherStats: false, exitOnCtrlC: false, useKittyKeyboard: {}, diff --git a/packages/opencode/src/cli/cmd/tui/config/tui-schema.ts b/packages/opencode/src/cli/cmd/tui/config/tui-schema.ts index ed79e8e52418..4c658a9e2067 100644 --- a/packages/opencode/src/cli/cmd/tui/config/tui-schema.ts +++ b/packages/opencode/src/cli/cmd/tui/config/tui-schema.ts @@ -24,6 +24,12 @@ export const TuiOptions = z.object({ .optional() .describe("Control diff rendering style: 'auto' adapts to terminal width, 'stacked' always shows single column"), mouse: z.boolean().optional().describe("Enable or disable mouse capture (default: true)"), + width_method: z + .enum(["unicode", "wcwidth", "no_zwj"]) + .optional() + .describe( + "Character width calculation method. Use 'no_zwj' if ZWJ emoji sequences cause layout corruption in your terminal (common with tmux and older terminals). Default: 'unicode'", + ), }) export const TuiInfo = z