opencode icon indicating copy to clipboard operation
opencode copied to clipboard

Keyboard shortcuts to edit prompts suck so much!

Open lcswillems opened this issue 3 weeks ago • 9 comments

Description

I'm in love with opencode! However, the editing experience for writting prompts (which is an essential piece of such a CLI) is very bad because a bunch of keyboard shortcuts don't work.

  • I can't enter a new line. shift+enter submits, ctrl+enter submits. ctrl+j is a default shortcut in VSCode. For every other CLI (e.g. codex), ctrl+enter inserts a new line. Related issues: https://github.com/sst/opencode/issues/1505, https://github.com/sst/opencode/issues/4189
  • I can't navigate fast across a prompt (e.g. I want to edit a part of the prompt way ealier or way latter than where I am right now) and need to keep pressing "left" / "right" for a while:
    • I can't jump to the previous / next word. ctrl+left and ctrl+right don't work while the standard is to jump before / after word. Related issues: https://github.com/sst/opencode/issues/1975, https://github.com/sst/opencode/issues/3090,
    • I can't jump to the beginning / end of the prompt. ctrl+pageup and ctrl+pagedown scroll the conversation, instead of the standard jump to beginning / end of text. Related issues: https://github.com/sst/opencode/issues/2649
  • I can't delete the word just after with ctrl+suppr. It deletes everything (before and after!!). The standard is ctrl+delete to delete the word before (it works) and ctrl+suppr to delete the word after. It doesn't work.

There are already a lot of issues on this subject, but they don't seem to be worked on at all, while it seems to be a very important matter. The single biggest reason I'm looking for alternatives to opencode is because the editing experience is so bad right now.

Context: I'm on Ubuntu and I use opencode in a terminal opened in VSCode.

OpenCode version

v1.0.123

lcswillems avatar Dec 01 '25 11:12 lcswillems

This issue might be a duplicate of existing issues. Please check:

  • #1975: ctrl + arrow key no longer moves word-to-word
  • #3090: add ctrl+left/right to navigate by word
  • #2649: Standard keyboard cursor navigation (Home/End key, ctrl+left/right key)
  • #3370: Text selection and navigation inside input with keyboard
  • #3978: Cannot Navigate the TextArea using Ctrl and Alt
  • #4261: Option+Right not jumping words as intended in some scenarios

These existing issues cover the keyboard navigation shortcut problems you're experiencing. Feel free to ignore if your case has additional specific requirements not addressed in these issues.

github-actions[bot] avatar Dec 01 '25 11:12 github-actions[bot]

By default opencode uses the de-facto standard emacs/readline/MacOS style keybindings used by most other applications, such as alt+left/alt+right to move wordwise, alt+backspace to delete the word preceding point and ctrl+a/ctrl+e to move point to the start/end of input fields.

Preferred key bindings are ultimately a matter of individual user preference, and so far as I'm aware all of the keys you've mentioned can be re-bound in your opencode.jsonc file's "keybinds" property. If you prefer the strange keybindings that Windows prefers, there's nothing stopping you from configuring them right now. Not a bug, IMO.

ariane-emory avatar Dec 01 '25 19:12 ariane-emory

@ariane-emory How could those keybinds be customized? They don't appear in the settings in opencode.jsonc or I missed them?

The market share of editors proposing ctrl+left, ctrl+right, etc (e.g. VSCode) is maybe an order of magnitude higher than the one of editors that propose alt+left, alt+right, alt+backspace, ctrl+a, ctrl+e, etc (e.g. emacs).

Furthermore, the common places for writting (e.g. Firefox, Chrome, Slack, etc) support the former keybinds rather than the later ones.

So very likely that people are in general way more likely to be used to the former ones than the later ones.

lcswillems avatar Dec 01 '25 22:12 lcswillems

Personally, I prefer my keyboard bindings to to be even more similar to emacs than opencode's defaults. So, I've got this in my opencode.json:

  "keybinds": {
    "model_cycle_recent_reverse": "alt+k",
    "model_cycle_recent": "alt+j",
    "command_list": "alt+x",
    "history_next": "ctrl+n",
    "history_previous": "ctrl+p",
    "session_child_cycle": "ctrl+right",
    "session_child_cycle_reverse": "ctrl+left",
  },

If you'd like to figure out the names for particular commands, I've found that the best way to get those answers is to launch opencode in it's own source code's directory and ask it - any decent model will do, the free opencode/big-pickle is usually pretty great at answering this type of question.

ariane-emory avatar Dec 01 '25 22:12 ariane-emory

Thanks @ariane-emory for the help!! 🙏 🙏

lcswillems avatar Dec 02 '25 13:12 lcswillems

as of 1.0.147 this is much improved

the only remaining issue is that newline can only be entered by ctrl+j (while its other keybinds don't work); the rest seems to work for me now

Nindaleth avatar Dec 11 '25 19:12 Nindaleth

@Nindaleth What OS and terminal are you using? I can use shift+enter to go to a new line and I can set the keybind ("input_newline") on linux

MilesNorton avatar Dec 11 '25 20:12 MilesNorton

@MilesNorton this is on Linux and Terminator terminal. I checked on Ghostty and shift+enter works there now, so it's just some terminals even on Linux.

Nindaleth avatar Dec 11 '25 21:12 Nindaleth

From the default shortcuts of "shift+return,ctrl+return,alt+return,ctrl+j", I found the alt+enter also works in addition to ctrl+j to produce a newline in Terminator, I might use alt+enter in the meantime

I understand that the path forward is a more modern terminal, but I'm delaying the switch to Ghostty as it's not yet a clear improvement over Terminator.

Nindaleth avatar Dec 12 '25 00:12 Nindaleth

shift+enter will only work in terminals that support modifyOtherKeys or kitty keyboard protocol, there is nothing opencode or opentui can do about that. Default navigation keybinds have been extended and all textarea text nav input_* bindings can now be customized, see https://opencode.ai/docs/keybinds/

kommander avatar Dec 15 '25 12:12 kommander

@kommander For example, when I do "shift+enter" in Codex inside VSCode, I don't have this issue. Why?

lcswillems avatar Dec 15 '25 12:12 lcswillems

Codex manipulates your vscode config and adds a custom keybinding sending a custom sequence that only Codex handles. Opencode will get some setup scripts to tweak terminal configs where possible, but as opt-in, to avoid surprises when conflicts happen, as has happened before with claude code manipulating the Ghostty config.

kommander avatar Dec 15 '25 12:12 kommander

Codex manipulates your vscode config and adds a custom keybinding sending a custom sequence that only Codex handles. Opencode will get some setup scripts to tweak terminal configs where possible, but as opt-in, to avoid surprises when conflicts happen, as has happened before with claude code manipulating the Ghostty config.

Thank you for planning to make it opt-in! It's very frustrating when app A goes and quietly mucks with the config of app B without making it clear to the user what was changed, and how they can control it themselves.

jdanbrown avatar Dec 15 '25 22:12 jdanbrown

I've added this to my VSCode config and now it works!!

{
    "key": "shift+enter",
    "command": "workbench.action.terminal.sendSequence",
    "args": {
      "text": "\u001B\u000A"
    },
    "when": "terminalFocus"
  },

lcswillems avatar Dec 16 '25 10:12 lcswillems