Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
884 views
in Technique[技术] by (71.8m points)

powershell - Make a keybinding to run previous or last shell commands

I frequently want to quickly re-run the last shell command that I used.

I know you can shift focus to the terminal, up arrow and enter but I thought there must be a better way than these three steps.

The sendSequence command in vscode is getting more powerful and so I looked for a way to create a keybinding that will run the last shell command quickly.

From sendSequence documentation:

Send text from a keybinding

The workbench.action.terminal.sendSequence command can be used to send a specific sequence of text to the terminal, including escape sequences. This enables things like sending arrow keys, enter, cursor moves, etc. The example below shows the sorts of things you can achieve with this feature, it jumps over the word to the left of the cursor (Ctrl+Left arrow) and presses backspace:

{
  "key": "ctrl+u",
  "command": "workbench.action.terminal.sendSequence",
  "args": { "text": "u001b[1;5Du007f" }
}

This feature supports variable substitution.

Note that the command only works with the u0000 format for using characters via their character code (not x00).

See terminal supports variables substitution:

{
  "key": "ctrl+shift+t",
  "command": "workbench.action.terminal.sendSequence",
  "args": { "text": ". ${file}" }
}

For example, see run files in terminal:

{
    "key": "ctrl+shift+t",
    "command": "workbench.action.terminal.sendSequence",
    "args": { "text": "node '${file}'u000D" }
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I came up with this keybinding:

{
  "key": "alt+x",

  "command": "workbench.action.terminal.sendSequence",

  "args": { "text": "u001b[Au000d" }
},
  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 Alt-x 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": "u0012watchu001b[1;5C" }    

That will send a Ctrl-R to the terminal which searches previous commands.

Then it will search for "watch", and then Ctrl-rightArrow to go to the end of "watch" where you could modify arguments if need be.

Or skip the Ctrl-rightArrow 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.]


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...