DEV Community

Bradford Fults
Bradford Fults

Posted on

Keybindings in Terminal in VS Code

I’ve been trying to use VS Code’s integrated Terminal function (Ctrl+`) and one of the most annoying things was that some of my long-used keybindings in my shell (used to be bash, now zsh) were not working.

Specifically:

  • Ctrl+r – Do a reverse command search in the terminal.
  • Ctrl+a – Move the cursor to the beginning of the current line.
  • Ctrl+e – Move the cursor to the end of the current line.

I know the latter two originate in Emacs, but I don’t much care about the history as much as I care about matching my 25+ years of muscle memory: I expect the cursor to move and instead I get an ugly ^A or ^E showing up on my terminal line, without any cursor movement.

Anyway, this was a complicated endeavor to figure out, but I resolved it thusly:

Fixing Ctrl+r

I updated the VS Code keybinding for Ctrl+r to just allow VS Code to take over the reverse search dialog entirely, which is fine for me:

# Command: Open Keyboard Shortcuts (JSON)
{ "key": "ctrl+r", "command": "workbench.action.terminal.runRecentCommand", "when": "terminalFocus"}
Enter fullscreen mode Exit fullscreen mode

Fixing Ctrl+a and Ctrl+e

First, I disabled keyboard “chords” in the terminal context because I don’t use chords at all, much less in the Terminal:

# Command: Open User Settings (JSON)
"terminal.integrated.allowChords": false
Enter fullscreen mode Exit fullscreen mode

Then I finally figured out that VS Code is booting my zsh shell with different options from Terminal.app, and thus I needed to explicitly set a mode in my .zshrc:

# ~/.zshrc
set -o emacs
Enter fullscreen mode Exit fullscreen mode

So now I have my Ctrl keybindings back and I can move forward happily with Terminal embedded within VS Code.

Top comments (0)