【问题标题】:vscode terminal: terminate process without promptvscode终端:在没有提示的情况下终止进程
【发布时间】:2017-10-23 22:29:21
【问题描述】:

我习惯于在 CLI 中通过按 Ctrl+C 两次来终止进程,但这在 vscode 的集成终端中不起作用。它提示确认。有没有办法以同样的方式使用它?甚至更好,只需 1 次按键。

【问题讨论】:

    标签: visual-studio-code command-line-interface


    【解决方案1】:

    看起来提示会在 vscode v1.64 中自动回复。见Auto-replies in Release notes

    自动回复

    终端现在能够在特定的情况下自动回复 字符序列被接收。这是一个很好的例子 有用的,也是唯一的默认情况,是 Windows 批处理 按下 ctrl+c 后的脚本消息Terminate batch job (Y/N)? 运行批处理脚本。这通常只会导致问题 为用户。终端现在将自动回复Y 和 输入 (\r) 让 Windows 中的 ctrl+c 感觉好多了。

    该功能是通用的,因此您可以设置自定义回复 另一件事,在发送文本时要小心 自动进入进程。例如,您可以使用它来 提示时自动更新 Oh My Zsh:

    "terminal.integrated.autoReplies": {
      "[Oh My Zsh] Would you like to check for updates? [Y/n]": "Y\r"
    }
    

    如果您使用 Clink 并启用它们的类似功能,您可以禁用它 在 Clink 或 VS Code 中,通过将回复设置为 null 来避免两者 相互冲突的功能:

    "terminal.integrated.autoReplies": {
      "Terminate batch job (Y/N)": null
    }
    
    • 所以看起来您将相应的消息设置为null禁用自动回复。

    set default to 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"
    ]
    

    然后您还需要添加以下键绑定(文件 → 首选项 → 键盘快捷键 → 打开 keybindings.json):

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

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

    这也将改变您在终端中运行的依赖于两个 ctrl-c 指令的任何工具的行为:因为您现在发送大写字母 @987654338 @ 和换行符作为第二条指令,确保你正在运行的任何东西都有可用的替代退出方式。

    带扩展:

    您可以通过添加此设置来使用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 是文本结尾(插入符号 = ^C)。

    • u\000D 是一个返回

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

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

    某些组合键不起作用(如 Ctrl-C 两次的标准序列),但使用 Ctrl kbd>-Shift-C,无论光标焦点在编辑器、文件资源管理器还是终端上都可以正常工作。

    请注意,这不会杀死或关闭终端或影响其历史记录,它只会在那里停止当前作业。

    【讨论】:

    • 我测试了您建议的编辑,但它不起作用 - 肯定需要间隔。中断完成的速度不足以接受下一个输入 (Y\000D)。当我想中断进程时,通常在编辑器中加上焦点,所以 ctrl+shift+c 版本非常方便。
    • 啊,考虑到文本 arg,显然要执行两次操作 - 我猜是完整发送了两次。
    • 请注意,此解决方案会干扰本身依赖 ctrl-c 的东西,例如 node.js:在 VS Code 的终端中运行节点并按两次 ctrl-c 退出它现在会导致改为发送输入Y。 (当然,还有其他专门退出节点的方法,但如果您正在运行一个侦听 ctrl-c 的 REPL,请记住,您将通过此修复禁用该功能)
    猜你喜欢
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    相关资源
    最近更新 更多