进行键绑定以运行上一个或上一个 shell 命令

Mar*_*ark 2 shell powershell visual-studio-code vscode-settings

我经常想快速重新运行我使用的最后一个 shell 命令。

我知道您可以将焦点转移到终端,向上箭头并输入,但我认为必须有比这三个步骤更好的方法。

sendSequencevscode 中的命令变得越来越强大,所以我寻找一种方法来创建一个可以快速运行最后一个 shell 命令的键绑定。

sendSequence 文档

从键绑定发送文本

workbench.action.terminal.sendSequence命令可用于向终端发送特定的文本序列,包括转义序列。这可以实现诸如发送箭头键、输入、光标移动等功能。下面的示例显示了您可以使用此功能实现的各种功能,它会跳过光标左侧的单词(Ctrl+向左箭头)并按下退格键:

{
  "key": "ctrl+u",
  "command": "workbench.action.terminal.sendSequence",
  "args": { "text": "\u001b[1;5D\u007f" }
}
Run Code Online (Sandbox Code Playgroud)

此功能支持变量替换。

请注意,该命令仅适用于\u0000通过字符代码(而不是\x00)使用字符的格式。

请参阅终端支持变量替换

{
  "key": "ctrl+shift+t",
  "command": "workbench.action.terminal.sendSequence",
  "args": { "text": ". ${file}" }
}
Run Code Online (Sandbox Code Playgroud)

例如,请参阅终端中的运行文件

{
    "key": "ctrl+shift+t",
    "command": "workbench.action.terminal.sendSequence",
    "args": { "text": "node '${file}'\u000D" }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ark 9

我想出了这个键绑定:

{
  "key": "alt+x",

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

  "args": { "text": "\u001b[A\u000d" }
},
Run Code Online (Sandbox Code Playgroud)
  1. \u001b 是一个转义序列,表示以下字符具有特殊含义。

  2. [A是一个向上的箭头。参见,例如,xterm 功能键

    Cursor Up    | CSI A
    Cursor Down  | CSI B
    Cursor Right | CSI C
    Cursor Left  | CSI D
    
    Run Code Online (Sandbox Code Playgroud)

(“CSI”指ESC\u001b或后跟 a[并代表“控制序列引入器”(CSI 为 0x9b)。)

所以“CSI A”\u001b[A等于向上箭头,它应该将您的终端命令列表循环到上一个命令。

  1. \u000d 是一个返回,所以命令会立即运行。

现在Alt-x或者您选择的任何键绑定将运行最后使用的 shell 命令,焦点可以在编辑器或终端中。

为了好玩,我把这个命令放在一起:

"args": { "text": "\u0012watch\u001b[1;5C" }    
Run Code Online (Sandbox Code Playgroud)

这将发出一个Ctrl-R到搜索以前的命令终端。

然后它将搜索“ watch”,然后Ctrl-rightArrow转到“ watch”的末尾,如果需要,您可以在此处修改参数。

或者跳过Ctrl-rightArrow部分 ( \u001b[1;5C) 并返回 ( \u000d) 以运行在历史记录中任何位置找到的命令。显然,您需要一个唯一的搜索词才能使其工作。

[在 powershell 和 git bash 中测试。未在其他地方测试。]