From 5fc81e319fe18a48698a220ba4a42e5b74c9a838 Mon Sep 17 00:00:00 2001 From: Julio Garcia Date: Sat, 14 Mar 2026 19:06:01 +0100 Subject: [PATCH 1/2] feat(ui): add configurable input window options Allow users to customize window-local options for the input window via `ui.input.win_options` in config. Any valid Neovim window option can be set, such as signcolumn, cursorline, number, relativenumber, etc. This improves flexibility for user preferences and editor appearance. --- lua/opencode/config.lua | 10 ++++++++++ lua/opencode/types.lua | 17 +++++++++++++++++ lua/opencode/ui/input_window.lua | 11 +++++++---- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/lua/opencode/config.lua b/lua/opencode/config.lua index 85c02c57..5053848c 100644 --- a/lua/opencode/config.lua +++ b/lua/opencode/config.lua @@ -160,6 +160,16 @@ M.defaults = { }, -- Auto-hide input window when prompt is submitted or focus switches to output window auto_hide = false, + -- Window-local options applied to the input window. + -- Any valid Neovim window option can be added here. + -- Users can override these and add any extra option, e.g.: + -- win_options = { signcolumn = 'no', cursorline = true, conceallevel = 2 } + win_options = { + signcolumn = 'yes', + cursorline = false, + number = false, + relativenumber = false, + }, }, picker = { snacks_layout = nil, diff --git a/lua/opencode/types.lua b/lua/opencode/types.lua index 6ad6aabf..9312af5c 100644 --- a/lua/opencode/types.lua +++ b/lua/opencode/types.lua @@ -142,11 +142,28 @@ ---@field highlights? OpencodeHighlightConfig ---@field picker OpencodeUIPickerConfig +---Window-local options applied to the input window. +---Any valid Neovim window-local option (`:h window-variable`) can be set here. +---Common examples: +--- signcolumn = 'no' +--- cursorline = true +--- number = true +--- relativenumber = true +--- foldcolumn = '0' +--- statuscolumn = '' +--- conceallevel = 2 +---@class OpencodeUIInputWinOptions : table +---@field signcolumn? string # Value for 'signcolumn' (e.g. 'yes', 'no', 'auto') +---@field cursorline? boolean +---@field number? boolean +---@field relativenumber? boolean + ---@class OpencodeUIInputConfig ---@field text { wrap: boolean } ---@field min_height number ---@field max_height number ---@field auto_hide boolean +---@field win_options? OpencodeUIInputWinOptions # Window-local options applied to the input window. Any valid Neovim window option is accepted. ---@class OpencodeHighlightConfig ---@field vertical_borders? { tool?: { fg?: string, bg?: string }, user?: { fg?: string, bg?: string }, assistant?: { fg?: string, bg?: string } } diff --git a/lua/opencode/ui/input_window.lua b/lua/opencode/ui/input_window.lua index 903b61b3..9889081e 100644 --- a/lua/opencode/ui/input_window.lua +++ b/lua/opencode/ui/input_window.lua @@ -268,10 +268,13 @@ function M.setup(windows) set_buf_option('filetype', 'opencode', windows) set_win_option('winhighlight', config.ui.window_highlight, windows) - set_win_option('signcolumn', 'yes', windows) - set_win_option('cursorline', false, windows) - set_win_option('number', false, windows) - set_win_option('relativenumber', false, windows) + + -- Apply user-configurable window options + local win_opts = config.ui.input.win_options or {} + for opt, value in pairs(win_opts) do + pcall(set_win_option, opt, value, windows) + end + set_buf_option('buftype', 'nofile', windows) set_buf_option('bufhidden', 'hide', windows) set_buf_option('buflisted', false, windows) From 6c48c8975e5a08d612773d8360c61f2282576ae8 Mon Sep 17 00:00:00 2001 From: Julio Garcia Date: Wed, 18 Mar 2026 14:00:04 +0100 Subject: [PATCH 2/2] feat(hooks): add on_question_asked user hook Introduce a new `on_question_asked` hook in the config, allowing users to execute custom logic when a question is asked. Updated types and renderer to support this hook, passing the session and question request to the user-defined function. --- lua/opencode/config.lua | 1 + lua/opencode/types.lua | 1 + lua/opencode/ui/renderer.lua | 5 +++++ 3 files changed, 7 insertions(+) diff --git a/lua/opencode/config.lua b/lua/opencode/config.lua index 9815756b..bf1a506b 100644 --- a/lua/opencode/config.lua +++ b/lua/opencode/config.lua @@ -266,6 +266,7 @@ M.defaults = { on_session_loaded = nil, on_done_thinking = nil, on_permission_requested = nil, + on_question_asked = nil, }, quick_chat = { default_model = nil, diff --git a/lua/opencode/types.lua b/lua/opencode/types.lua index 45d14afe..d97403b8 100644 --- a/lua/opencode/types.lua +++ b/lua/opencode/types.lua @@ -213,6 +213,7 @@ ---@field on_session_loaded? fun(session: Session): nil ---@field on_done_thinking? fun(session: Session): nil ---@field on_permission_requested? fun(session: Session): nil +---@field on_question_asked? fun(session: Session, question_request: OpencodeQuestionRequest): nil ---@class OpencodeProviders ---@field [string] string[] diff --git a/lua/opencode/ui/renderer.lua b/lua/opencode/ui/renderer.lua index 1c1eb382..798f4027 100644 --- a/lua/opencode/ui/renderer.lua +++ b/lua/opencode/ui/renderer.lua @@ -1021,6 +1021,11 @@ function M.on_question_asked(properties) return end + if config.hooks and config.hooks.on_question_asked then + local session = state.active_session or {} + pcall(config.hooks.on_question_asked, session, properties) + end + local question_window = require('opencode.ui.question_window') question_window.show_question(properties) end