diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx index 3fb20f16797..73c7d6f6d57 100644 --- a/packages/opencode/src/cli/cmd/tui/app.tsx +++ b/packages/opencode/src/cli/cmd/tui/app.tsx @@ -476,15 +476,18 @@ function App() { } const text = renderer.getSelection()?.getSelectedText() if (text && text.length > 0) { - const base64 = Buffer.from(text).toString("base64") - const osc52 = `\x1b]52;c;${base64}\x07` - const finalOsc52 = process.env["TMUX"] ? `\x1bPtmux;\x1b${osc52}\x1b\\` : osc52 - /* @ts-expect-error */ - renderer.writeOut(finalOsc52) - await Clipboard.copy(text) - .then(() => toast.show({ message: "Copied to clipboard", variant: "info" })) - .catch(toast.error) - renderer.clearSelection() + const copyOnSelect = sync.data.config.tui?.copy_on_select ?? true + if (copyOnSelect) { + const base64 = Buffer.from(text).toString("base64") + const osc52 = `\x1b]52;c;${base64}\x07` + const finalOsc52 = process.env["TMUX"] ? `\x1bPtmux;\x1b${osc52}\x1b\\` : osc52 + /* @ts-expect-error */ + renderer.writeOut(finalOsc52) + await Clipboard.copy(text) + .then(() => toast.show({ message: "Copied to clipboard", variant: "info" })) + .catch(toast.error) + renderer.clearSelection() + } } }} > diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index d38de8a9407..e7ed30296b9 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -466,6 +466,11 @@ export namespace Config { }) .optional() .describe("Scroll acceleration settings"), + copy_on_select: z + .boolean() + .optional() + .default(true) + .describe("Enable copying text to clipboard when selected with mouse"), diff_style: z .enum(["auto", "stacked"]) .optional() diff --git a/packages/sdk/go/config.go b/packages/sdk/go/config.go index 02460fb5df9..dc8ab0e8df1 100644 --- a/packages/sdk/go/config.go +++ b/packages/sdk/go/config.go @@ -1834,15 +1834,18 @@ func (r ConfigShare) IsKnown() bool { // TUI specific settings type ConfigTui struct { // TUI scroll speed - ScrollSpeed float64 `json:"scroll_speed"` - JSON configTuiJSON `json:"-"` + ScrollSpeed float64 `json:"scroll_speed"` + // Enable copying text to clipboard when selected with mouse + CopyOnSelect bool `json:"copy_on_select"` + JSON configTuiJSON `json:"-"` } // configTuiJSON contains the JSON metadata for the struct [ConfigTui] type configTuiJSON struct { - ScrollSpeed apijson.Field - raw string - ExtraFields map[string]apijson.Field + ScrollSpeed apijson.Field + CopyOnSelect apijson.Field + raw string + ExtraFields map[string]apijson.Field } func (r *ConfigTui) UnmarshalJSON(data []byte) (err error) { diff --git a/packages/sdk/js/src/gen/types.gen.ts b/packages/sdk/js/src/gen/types.gen.ts index c640f41a719..55a344636da 100644 --- a/packages/sdk/js/src/gen/types.gen.ts +++ b/packages/sdk/js/src/gen/types.gen.ts @@ -1160,6 +1160,10 @@ export type Config = { */ enabled: boolean } + /** + * Enable copying text to clipboard when selected with mouse + */ + copy_on_select?: boolean /** * Control diff rendering style: 'auto' adapts to terminal width, 'stacked' always shows single column */