VSCode终端:不提示终止进程

8

我习惯于通过在CLI中按两次 Ctrl+C 终止进程,但是在vscode的集成终端中无法这样做。它会提示确认。有没有办法以相同的方式使用它?或者更好的是,只需按一次键。

1个回答

12
看起来在vscode v1.64中,提示信息将自动回复。请参见发布说明中的Auto-replies: “自动回复”功能让终端在接收到特定字符序列时能够自动回复。一个很好的例子是Windows批处理脚本消息“Terminate batch job (Y/N)?”,在运行批处理脚本时按下ctrl+c后出现这个消息,这通常会给用户带来麻烦。现在,终端将自动回复“Y”并输入(\r),这使得在Windows中使用ctrl+c感觉更好了。 terminal auto-reply demo 该功能是通用的,因此您可以为其他事物设置自定义回复,但在执行此操作时要小心,因为您正在向进程自动发送文本。例如,您可以在提示时使用它来自动更新Oh My Zsh。
"terminal.integrated.autoReplies": {
  "[Oh My Zsh] Would you like to check for updates? [Y/n]": "Y\r"
}
如果您使用Clink并启用了它们的类似功能,则可以通过将回复设置为null来在Clink或VS Code中禁用它,以避免两个功能之间的冲突。
"terminal.integrated.autoReplies": {
  "Terminate batch job (Y/N)": null
}
  • 看起来你将相应的消息设置为null禁用自动回复。

设置默认值为null:看起来他们正在将默认值更改为禁用。


没有扩展:

在文件→首选项→设置中搜索字符串terminal.integrated.commandsToSkipShell,然后单击“在settings.json中编辑”。将"workbench.action.terminal.sendSequence"添加到你的settings.json中的terminal.integrated.commandsToSkipShell列表中。

如果你的settings.json中没有"terminal.integrated.commandsToSkipShell"条目,只需添加它:

... ,
"terminal.integrated.commandsToSkipShell": [
  "workbench.action.terminal.sendSequence"
]

那么您还需要添加以下密钥绑定(File → Preferences → Keyboard Shortcuts → open keybindings.json):

{
    "key": "ctrl+c",
    "command": "workbench.action.terminal.sendSequence",
    "args": {
        "text": "\u0003Y\u000D"
    },
    "when": "terminalFocus && !terminalTextSelected"
}

请注意,此解决方案需要您使用Ctrl-C 两次,并且仅适用于Visual Studio Code终端。

这还将更改在终端中运行的任何依赖于两个ctrl-c指令的工具的行为:因为您现在发送的是大写字母Y和一个换行符作为第二个指令,因此请确保您正在运行的任何工具都有可用的备用退出方式。

使用扩展:

您可以使用multi-command扩展,通过添加此设置:

"multiCommand.commands": [
  {
    "command": "multiCommand.terminateTerminal",
    "interval": 1000,
    "sequence": [
      {
        "command": "workbench.action.terminal.sendSequence",
        "args": {
          "text": "\u0003"
        }
      },
      {
        "command": "workbench.action.terminal.sendSequence",
        "args": {
          "text": "Y\u000D"
        }
      },
    ]
  }

interval提供了两个sendSequence命令之间的暂停,这两个命令都是必需的:

  • u\003是文本结束符(Caret = ^C)。

  • u\000D是一个回车键。

然后在keybindings.json中添加一个按键绑定:

{
  "key": "ctrl+shift+c",
  "command": "extension.multiCommand.execute",
  "args": { "command": "multiCommand.terminateTerminal" },
},

某些关键组合键将无法使用(例如标准序列Ctrl-C两次),但是使用Ctrl-Shift-C,无论光标焦点在编辑器、文件浏览器还是终端中,它都可以正常工作。

请注意,这不会关闭或结束终端,也不会影响其历史记录,它只会停止当前的作业。


我测试了你建议的修改,但它并没有起作用 - 明显需要间隔。中断不够快以接收下一个输入(Y\000D)。此外,当我想要中断进程时,通常焦点在编辑器中,因此ctrl+shift+c版本真的非常方便。 - Mark
啊,看起来并不明显,因为文本参数被发送了两次完整的内容。 - Mark
请注意,此解决方案将干扰那些依赖于ctrl-c的事物,例如node.js:在VS Code终端中运行node并按两次ctrl-c退出它现在将导致发送输入“Y”。 (当然,有其他方法可以特别退出node,但如果您正在运行侦听ctrl-c的REPL,请记住使用此修复程序将禁用该功能) - Mike 'Pomax' Kamermans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接