return { 'nickjvandyke/opencode.nvim', version = '*', -- Latest stable release dependencies = { { -- `snacks.nvim` integration is recommended, but optional ---@module "snacks" <- Loads `snacks.nvim` types for configuration intellisense 'folke/snacks.nvim', optional = true, opts = { input = {}, -- Enhances `ask()` picker = { -- Enhances `select()` actions = { opencode_send = function(...) return require('opencode').snacks_picker_send(...) end, }, win = { input = { keys = { [''] = { 'opencode_send', mode = { 'n', 'i' } }, }, }, }, }, }, }, }, config = function() local sidebar_filetypes = { ['neo-tree'] = true, ['snacks_layout_box'] = true, ['snacks_terminal'] = true, ['toggleterm'] = true, ['opencode'] = true, } local function focus_main_window() for _, win in ipairs(vim.api.nvim_tabpage_list_wins(0)) do local buf = vim.api.nvim_win_get_buf(win) local ft = vim.bo[buf].filetype local bt = vim.bo[buf].buftype if not sidebar_filetypes[ft] and bt == '' then vim.api.nvim_set_current_win(win) return true end end return false end ---@type opencode.Opts vim.g.opencode_opts = { server = { start = function() require('opencode.terminal').open('opencode --port', { split = 'right', width = math.max(40, math.floor(vim.o.columns * 0.4)), }) end, stop = function() require('opencode.terminal').close() end, toggle = function() require('opencode.terminal').toggle('opencode --port', { split = 'right', width = math.max(40, math.floor(vim.o.columns * 0.4)), }) end, }, } vim.o.autoread = true -- Required for `opts.events.reload` -- Recommended/example keymaps vim.keymap.set({ 'n', 'x' }, '', function() require('opencode').ask('@this: ', { submit = true }) end, { desc = 'Ask opencode…' }) vim.keymap.set({ 'n', 'x' }, '', function() require('opencode').select() end, { desc = 'Execute opencode action…' }) vim.keymap.set({ 'n', 't' }, '', function() require('opencode').toggle() end, { desc = 'Toggle opencode' }) vim.keymap.set({ 'n', 'x' }, 'go', function() return require('opencode').operator '@this ' end, { desc = 'Add range to opencode', expr = true }) vim.keymap.set('n', 'goo', function() return require('opencode').operator '@this ' .. '_' end, { desc = 'Add line to opencode', expr = true }) vim.keymap.set('n', '', function() require('opencode').command 'session.half.page.up' end, { desc = 'Scroll opencode up' }) vim.keymap.set('n', '', function() require('opencode').command 'session.half.page.down' end, { desc = 'Scroll opencode down' }) -- You may want these if you use the opinionated `` and `` keymaps above — otherwise consider `o…` (and remove terminal mode from the `toggle` keymap) vim.keymap.set('n', '+', '', { desc = 'Increment under cursor', noremap = true }) vim.keymap.set('n', '-', '', { desc = 'Decrement under cursor', noremap = true }) vim.api.nvim_create_autocmd('VimEnter', { callback = function() if vim.fn.argc() == 1 and vim.fn.isdirectory(vim.fn.argv(0)) == 1 then vim.schedule(function() pcall(function() require('persistence').load() end) vim.schedule(function() focus_main_window() require('opencode').toggle() focus_main_window() end) end) end end, }) end, }