Skip to content

Commit 8c65d9b

Browse files
cameronrsudo-tee
authored andcommitted
feat(config)!: modern keymap format + mode support (#52)
This is a complete overhaul of the keymaps, The old config should still work but with a warning for migration The new format shoud now be: ```lua keymap = { editor = { ['<leader>og'] = { 'toggle' }, -- I don't think we really need to support just string, it makes things more complex for nothing ['<leader>oi'] = { 'open_input' }, ['<leader>oI'] = { 'open_input_new_session' }, ['<leader>oo'] = { 'open_output' }, ['<leader>ot'] = { 'toggle_focus' }, ['<leader>oq'] = { 'close' }, ['<leader>os'] = { 'select_session' }, ['<leader>op'] = { 'configure_provider' }, ['<leader>od'] = { 'diff_open' }, ['<leader>o]'] = { 'diff_next' }, ['<leader>o['] = { 'diff_prev' }, ['<leader>oc'] = { 'diff_close' }, ['<leader>ora'] = { 'diff_revert_all_last_prompt' }, ['<leader>ort'] = { 'diff_revert_this_last_prompt' }, ['<leader>orA'] = { 'diff_revert_all' }, ['<leader>orT'] = { 'diff_revert_this' }, ['<leader>orr'] = { 'diff_restore_snapshot_file' }, ['<leader>orR'] = { 'diff_restore_snapshot_all' }, ['<leader>oC'] = { 'open_configuration_file' }, ['<leader>ox'] = { 'swap_position' }, ['<leader>opa'] = { 'permission_accept' }, ['<leader>opA'] = { 'permission_accept_all' }, ['<leader>opd'] = { 'permission_deny' }, }, output_window = { ['<leader>something'] = {function () -- custom code end}, ['<esc>'] = { 'close' }, ['<C-c>'] = { 'stop' }, [']]'] = { 'next_message' }, ['[['] = { 'prev_message' }, ['<tab>'] = { 'toggle_pane', mode = { 'n', 'i' } }, ['<C-i>'] = { 'focus_input' }, ['<leader>oS'] = { 'select_child_session' }, ['<leader>oD'] = { 'debug_message' }, ['<leader>oO'] = { 'debug_output' }, ['<leader>ods'] = { 'debug_session' }, }, input_window = { ['<cr>'] = { 'submit_input_prompt', mode = { 'n', 'i' } }, ['<esc>'] = { 'close' }, ['<C-c>'] = { 'stop' }, ['~'] = { 'mention_file', mode = 'i' }, ['@'] = { 'mention', mode = 'i' }, ['/'] = { 'slash_commands', mode = 'i' }, ['<tab>'] = { 'toggle_pane', mode = { 'n', 'i' } }, ['<up>'] = { 'prev_prompt_history', mode = { 'n', 'i' } }, ['<down>'] = { 'next_prompt_history', mode = { 'n', 'i' } }, ['<M-m>'] = { 'switch_mode' }, ['<leader>oS'] = { 'select_child_session' }, ['<leader>oD'] = { 'debug_message' }, ['<leader>oO'] = { 'debug_output' }, ['<leader>ods'] = { 'debug_session' }, }, permission = { accept = 'a', accept_all = 'A', deny = 'd', }, ```
1 parent fb33ce6 commit 8c65d9b

File tree

17 files changed

+678
-357
lines changed

17 files changed

+678
-357
lines changed

README.md

Lines changed: 72 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ Install the plugin with your favorite package manager. See the [Configuration](#
9090

9191
## ⚙️ Configuration
9292

93+
> **Note**: The keymap configuration structure has been updated. Old keymaps (`keymap.global` and `keymap.window`) will be mapped to the new format (`keymap.editor`, `keymap.input_window`, `keymap.output_window`) but you should update your config to the new format. See [Keymap Configuration](#keymap-configuration) below for details.
94+
9395
```lua
9496
-- Default configuration with all available options
9597
require('opencode').setup({
@@ -98,49 +100,58 @@ require('opencode').setup({
98100
default_global_keymaps = true, -- If false, disables all default global keymaps
99101
default_mode = 'build', -- 'build' or 'plan' or any custom configured. @see [OpenCode Agents](https://opencode.ai/docs/modes/)
100102
keymap = {
101-
global = {
102-
toggle = '<leader>og', -- Open opencode. Close if opened
103-
open_input = '<leader>oi', -- Opens and focuses on input window on insert mode
104-
open_input_new_session = '<leader>oI', -- Opens and focuses on input window on insert mode. Creates a new session
105-
open_output = '<leader>oo', -- Opens and focuses on output window
106-
toggle_focus = '<leader>ot', -- Toggle focus between opencode and last window
107-
close = '<leader>oq', -- Close UI windows
108-
select_session = '<leader>os', -- Select and load a opencode session
109-
configure_provider = '<leader>op', -- Quick provider and model switch from predefined list
110-
diff_open = '<leader>od', -- Opens a diff tab of a modified file since the last opencode prompt
111-
diff_next = '<leader>o]', -- Navigate to next file diff
112-
diff_prev = '<leader>o[', -- Navigate to previous file diff
113-
diff_close = '<leader>oc', -- Close diff view tab and return to normal editing
114-
diff_revert_all_last_prompt = '<leader>ora', -- Revert all file changes since the last opencode prompt
115-
diff_revert_this_last_prompt = '<leader>ort', -- Revert current file changes since the last opencode prompt
116-
diff_revert_all = '<leader>orA', -- Revert all file changes since the last opencode session
117-
diff_revert_this = '<leader>orT', -- Revert current file changes since the last opencode session
118-
swap_position = '<leader>ox', -- Swap Opencode pane left/right
119-
permission_accept = '<leader>opa', -- Accept permission request once
120-
permission_accept_all = '<leader>opA', -- Accept all (for current tool)
121-
permission_deny = '<leader>opd',-- Accept permission request once
103+
editor = {
104+
['<leader>og'] = { 'toggle' }, -- Open opencode. Close if opened
105+
['<leader>oi'] = { 'open_input' }, -- Opens and focuses on input window on insert mode
106+
['<leader>oI'] = { 'open_input_new_session' }, -- Opens and focuses on input window on insert mode. Creates a new session
107+
['<leader>oo'] = { 'open_output' }, -- Opens and focuses on output window
108+
['<leader>ot'] = { 'toggle_focus' }, -- Toggle focus between opencode and last window
109+
['<leader>oq'] = { 'close' }, -- Close UI windows
110+
['<leader>os'] = { 'select_session' }, -- Select and load a opencode session
111+
['<leader>op'] = { 'configure_provider' }, -- Quick provider and model switch from predefined list
112+
['<leader>od'] = { 'diff_open' }, -- Opens a diff tab of a modified file since the last opencode prompt
113+
['<leader>o]'] = { 'diff_next' }, -- Navigate to next file diff
114+
['<leader>o['] = { 'diff_prev' }, -- Navigate to previous file diff
115+
['<leader>oc'] = { 'diff_close' }, -- Close diff view tab and return to normal editing
116+
['<leader>ora'] = { 'diff_revert_all_last_prompt' }, -- Revert all file changes since the last opencode prompt
117+
['<leader>ort'] = { 'diff_revert_this_last_prompt' }, -- Revert current file changes since the last opencode prompt
118+
['<leader>orA'] = { 'diff_revert_all' }, -- Revert all file changes since the last opencode session
119+
['<leader>orT'] = { 'diff_revert_this' }, -- Revert current file changes since the last opencode session
120+
['<leader>orr'] = { 'diff_restore_snapshot_file' }, -- Restore a file to a restore point
121+
['<leader>orR'] = { 'diff_restore_snapshot_all' }, -- Restore all files to a restore point
122+
['<leader>ox'] = { 'swap_position' }, -- Swap Opencode pane left/right
123+
['<leader>opa'] = { 'permission_accept' }, -- Accept permission request once
124+
['<leader>opA'] = { 'permission_accept_all' }, -- Accept all (for current tool)
125+
['<leader>opd'] = { 'permission_deny' }, -- Deny permission request once
126+
},
127+
input_window = {
128+
['<cr>'] = { 'submit_input_prompt', mode = { 'n', 'i' } }, -- Submit prompt (normal mode and insert mode)
129+
['<esc>'] = { 'close' }, -- Close UI windows
130+
['<C-c>'] = { 'stop' }, -- Stop opencode while it is running
131+
['~'] = { 'mention_file', mode = 'i' }, -- Pick a file and add to context. See File Mentions section
132+
['@'] = { 'mention', mode = 'i' }, -- Insert mention (file/agent)
133+
['/'] = { 'slash_commands', mode = 'i' }, -- Pick a command to run in the input window
134+
['<tab>'] = { 'toggle_pane', mode = { 'n', 'i' } }, -- Toggle between input and output panes
135+
['<up>'] = { 'prev_prompt_history', mode = { 'n', 'i' } }, -- Navigate to previous prompt in history
136+
['<down>'] = { 'next_prompt_history', mode = { 'n', 'i' } }, -- Navigate to next prompt in history
137+
['<M-m>'] = { 'switch_mode' }, -- Switch between modes (build/plan)
138+
},
139+
output_window = {
140+
['<esc>'] = { 'close' }, -- Close UI windows
141+
['<C-c>'] = { 'stop' }, -- Stop opencode while it is running
142+
[']]'] = { 'next_message' }, -- Navigate to next message in the conversation
143+
['[['] = { 'prev_message' }, -- Navigate to previous message in the conversation
144+
['<tab>'] = { 'toggle_pane', mode = { 'n', 'i' } }, -- Toggle between input and output panes
145+
['<C-i>'] = { 'focus_input' }, -- Focus on input window and enter insert mode at the end of the input from the output window
146+
['<leader>oS'] = { 'select_child_session' }, -- Select and load a child session
147+
['<leader>oD'] = { 'debug_message' }, -- Open raw message in new buffer for debugging
148+
['<leader>oO'] = { 'debug_output' }, -- Open raw output in new buffer for debugging
149+
['<leader>ods'] = { 'debug_session' }, -- Open raw session in new buffer for debugging
122150
},
123-
window = {
124-
submit = '<cr>', -- Submit prompt (normal mode)
125-
submit_insert = '<cr>', -- Submit prompt (insert mode)
126-
close = '<esc>', -- Close UI windows
127-
stop = '<C-c>', -- Stop opencode while it is running
128-
next_message = ']]', -- Navigate to next message in the conversation
129-
prev_message = '[[', -- Navigate to previous message in the conversation
130-
mention = '@', -- Insert mention (file/agent)
131-
mention_file = '~', -- Pick a file and add to context. See File Mentions section
132-
slash_commands = '/', -- Pick a command to run in the input window
133-
toggle_pane = '<tab>', -- Toggle between input and output panes
134-
prev_prompt_history = '<up>', -- Navigate to previous prompt in history
135-
next_prompt_history = '<down>', -- Navigate to next prompt in history
136-
switch_mode = '<M-m>', -- Switch between modes (build/plan)
137-
focus_input = '<C-i>', -- Focus on input window and enter insert mode at the end of the input from the output window
138-
select_child_session = '<leader>oS', -- Select and load a child session
139-
debug_message = '<leader>oD', -- Open raw message in new buffer for debugging
140-
debug_output = '<leader>oO', -- Open raw output in new buffer for debugging
141-
permission_accept = 'a', -- Accept permission request once (only available when there is a pending permission request)
142-
permission_accept_all = 'A', -- Accept all (for current tool) permission request once (only available when there is a pending permission request)
143-
permission_deny = 'd',-- Accept permission request once (only available when there is a pending permission request)
151+
permission = {
152+
accept = 'a', -- Accept permission request once (only available when there is a pending permission request)
153+
accept_all = 'A', -- Accept all (for current tool) permission request once (only available when there is a pending permission request)
154+
deny = 'd', -- Deny permission request once (only available when there is a pending permission request)
144155
},
145156
},
146157
ui = {
@@ -154,7 +165,7 @@ require('opencode').setup({
154165
window_highlight = 'Normal:OpencodeBackground,FloatBorder:OpencodeBorder', -- Highlight group for the opencode window
155166
icons = {
156167
preset = 'emoji', -- 'emoji' | 'text'. Choose UI icon style (default: 'emoji')
157-
overrides = {}, -- Optional per-key overrides, see section below
168+
overrides = {}, -- Optional per-key overrides, see section below
158169
},
159170
output = {
160171
tools = {
@@ -224,6 +235,24 @@ require('opencode').setup({
224235
})
225236
```
226237

238+
### Keymap Configuration
239+
240+
The keymap configuration has been restructured for better organization and clarity:
241+
242+
- **`editor`**: Global keymaps that are available throughout Neovim
243+
- **`input_window`**: Keymaps specific to the input window
244+
- **`output_window`**: Keymaps specific to the output window
245+
- **`permission`**: Special keymaps for responding to permission requests (available in input/output windows when there's a pending permission)
246+
247+
**Backward Compatibility**: The plugin automatically maps configurations that use `keymap.global` and `keymap.window` to the new structure. A deprecation warning will be shown during migration. Update your configuration to use the new structure to remove the warning.
248+
249+
Each keymap entry is a table consising of:
250+
251+
- The string name of an api function = `{ 'toggle' }`
252+
- Or a custom function: `{ function() ... end }`
253+
- An optional mode: `{ 'toggle', mode = { 'n', 'i' } }`
254+
- An optional desc: `{'toggle', desc = 'Toggle Opencode' }`
255+
227256
### UI icons (disable emojis or customize)
228257

229258
By default, opencode.nvim uses emojis for icons in the UI. If you prefer a plain, emoji-free interface, you can switch to the `text` preset or override icons individually.

lua/opencode/api.lua

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -229,8 +229,8 @@ function M.next_history()
229229
end
230230

231231
function M.prev_prompt_history()
232-
local config = require('opencode.config').get()
233-
local key = config.keymap.window.prev_prompt_history
232+
local config = require('opencode.config')
233+
local key = config.get_key_for_function('input_window', 'prev_prompt_history')
234234
if key ~= '<up>' then
235235
return M.prev_history()
236236
end
@@ -244,8 +244,8 @@ function M.prev_prompt_history()
244244
end
245245

246246
function M.next_prompt_history()
247-
local config = require('opencode.config').get()
248-
local key = config.keymap.window.next_prompt_history
247+
local config = require('opencode.config')
248+
local key = config.get_key_for_function('input_window', 'next_prompt_history')
249249
if key ~= '<down>' then
250250
return M.next_history()
251251
end
@@ -282,15 +282,15 @@ function M.mention_file()
282282
end
283283

284284
function M.mention()
285-
local config = require('opencode.config').get()
286-
local char = config.keymap.window.mention
285+
local config = require('opencode.config')
286+
local char = config.get_key_for_function('input_window', 'mention')
287287
ui.focus_input({ restore_position = true, start_insert = true })
288288
require('opencode.ui.completion').trigger_completion(char)()
289289
end
290290

291291
function M.slash_commands()
292-
local config = require('opencode.config').get()
293-
local char = config.keymap.window.slash_commands
292+
local config = require('opencode.config')
293+
local char = config.get_key_for_function('input_window', 'slash_commands')
294294
ui.focus_input({ restore_position = true, start_insert = true })
295295
require('opencode.ui.completion').trigger_completion(char)()
296296
end

0 commit comments

Comments
 (0)