Make a keybinding to run previous or last shell commands

With vscode v1.69 and shell integration enabled, there is now a built-in command to do this (for supported shells).

  1. Eanble the setting Terminal > Integrated > Shell Integration: Enabled
  2. Set a shortcut for the command Terminal: Run Recent Command from the Keyboard Shortcuts editor.

You should end up with a keybinding like this (in your keybindings.json):

{
  "key": "alt+x",         // whatever you chose as a keybinding
  "command": "workbench.action.terminal.runRecentCommand"
}

Supported shells are limited to Windows: pwsh and Linux/Mac: bash, pwsh and zsh.

This setting applies only when terminals are created, so you will need
to restart your terminals for it to take effect.


Also see https://stackoverflow.com/a/70900927/836330 for how to see a QuickPick of recent terminal commands (in preview as of v1.64) for certain supported shells and OS’s.


I came up with this keybinding:

{
  "key": "alt+x",

  "command": "workbench.action.terminal.sendSequence",
      
  "args": { "text": "\u001b[A\u000d" }
},
  1. \u001b is an escape sequence to indicate the following characters have special meaning.

  2. [A is an up arrow. See, e.g., xterm function keys:

    Cursor Up    | CSI A
    Cursor Down  | CSI B
    Cursor Right | CSI C
    Cursor Left  | CSI D
    

(the “CSI” refers to ESC or \u001b or followed by a [ and stands for “Control Sequence Introducer” (CSI is 0x9b).)

So “CSI A” is \u001b[A which is equal to an up arrow which should cycle your terminal command list to the previous command.

  1. \u000d is a return, so the command runs immediately.

Now Altx or whatever keybinding you choose will run the last shell command used, focus can be in the editor or the terminal.

For fun I put together this command:

"args": { "text": "\u0012watch\u001b[1;5C" }    

That will send a CtrlR to the terminal which searches previous commands.

Then it will search for “watch“, and then CtrlrightArrow to go to the end of “watch” where you could modify arguments if need be.

Or skip the CtrlrightArrow part (\u001b[1;5C) and do a return (\u000d) to run the command that was found anywhere in your history. Obviously, you will need a unique search term for that to work.

[Tested in powershell and git bash. Not tested elsewhere.]

Leave a Comment