繁体   English   中英

将按键绑定到使用 Visual Studio 代码中的当前文件的 shell 命令

[英]Bind a keypress to a shell command that uses the current file in visual studio code

有没有办法创建一个键绑定来对文件执行 shell 命令? 就像是:

{
    "key": "ctrl+shift+e",
    "command": "run",
    "command": "touch $file",
    "when": "editorTextFocus"
}

我不想使用任务,因为这需要对整个编辑器是全局的,而不是特定的工作区。

[请参阅下面的编辑 - 现在更容易做到。]

我想出了一种方法来做你想做的事,但这有点像黑客。 您可能知道,如果您可以在 .vscode/tasks.json 中创建任务并使用类似以下内容,则绑定任务很容易:

{
  "key": "shift+escape",
  "command": "workbench.action.tasks.runTask",
  "args": "Start server and process files"
},

在没有预先存在的任务的情况下通过键绑定运行脚本要复杂得多。 但是,您可以尝试以下利用"workbench.action.terminal.runSelectedText",命令的方法。 但是我们需要先将脚本放入选择中,因此:

使用宏扩展(有点粗糙),以便我们可以将多个命令联系在一起。 在您的用户设置中

"runCommandInTerminal": [

   {
     "command": "type",
     "args": {
        "text": "node -v"
     }
  },
  { 
    "command": "cursorMove",
    "args": {
       "to": "wrappedLineStart",
       "by": "wrappedLine",
       "value": 1,
       "select": true
    }
  },
  "workbench.action.terminal.runSelectedText",
  "editor.action.clipboardCutAction",
  //  "workbench.action.terminal.focus"
],

这是设置"runCommandInTerminal"的一般示例,然后您可以将其绑定到 keybindings.json 中您希望的任何键和弦,例如

{
    "key": "ctrl+shift+e",
    "command": "macros.runCommandInTerminal"
},

您的示例有点难,因为您想访问${file} ,而您在设置中无法访问,只能访问 tasks.json 和 launch.json。 幸运的是,有一个命令可以获取当前文件: "copyFilePath" 所以试试

"runCommandInTerminal": [

      "copyFilePath",
      {
        "command": "type",
        "args": {
          "text": "touch "
        }
      },
      "editor.action.clipboardPasteAction",
      { 
      "command": "cursorMove",
        "args": {
        "to": "wrappedLineStart",
        "by": "wrappedLine",
        "value": 1,
        "select": true
        }
      },
      "workbench.action.terminal.runSelectedText",
      "editor.action.clipboardCutAction",
      // "workbench.action.terminal.focus"
],

首先获取文件路径,然后输出脚本命令的第一部分“ touch ”。

接下来将文件路径附加到命令的末尾。

移动光标选择前面的。

在终端中运行选择。

从编辑器中剪切选择。

这可以与您的键绑定一起运行。 您将看到正在键入和剪切脚本的闪光,但您的编辑器代码不会受到影响。 最好从编辑器中的空白行运行它,但如果您愿意,也可以从不相关代码行的开头运行它(但现在缩进可能会丢失)。

这是hacky,但似乎工作。 我很想知道是否有扩展或其他方式来做这个清洁工。


2019 年 5 月编辑

由于我的原始答案(如@Jeff 所示)vscode 添加了sendSequence命令。 以及在该命令中使用变量的能力。 所以现在OP的问题更容易完成:

{
  "key": "alt+x",
  "command": "workbench.action.terminal.sendSequence",
  "args": {"text": "touch ${file}"}
}

在您的 keybindings.json 文件中。 使用 sendSequnce 命令查看变量

在这里使用 Marks 回答我可以解决我使用一些快捷方式运行 android 命令的情况。 之后我决定在我的 GitHub 上创建一个指南,希望能有所帮助。

GitHub: LucasMMota

使用键盘快捷键运行 Shell 脚本

在这个例子中,我设置了一个键盘快捷键来在我的本机项目上运行 android reload。

    1. 安装宏扩展以执行多个命令。
    1. 安装后转到首选项>设置(或 cmd+,)
    1. 找到宏配置并用于在用户设置中进行编辑,或者只需在您的用户设置中添加以下内容:

    {

     //... other configs you could have "macros": { "runCommandInTerminal": [ "editor.action.insertLineAfter", // go to new line below { "command": "type", "args": { "text": "adb shell input text \\"RR\\" " // exec cmd to reload android device (could be any else) } }, // select text typed above { "command": "cursorMove", "args": { "to": "wrappedLineStart", "by": "wrappedLine", "value": 1, "select": true } }, "workbench.action.terminal.runSelectedText", //run command "editor.action.clipboardCutAction", // remove cmd typed //"editor.action.deleteLines", //couldn't use. When uncommented, command doesn't work ], }

    }

    1. 现在我们已经设置了命令,我们需要设置一个触发器快捷方式。 所以转到 Preferences>Keyboard Shortcuts(或 cmd+k),打开 keybindings.json 并像这样编辑:

    {

    "key": "alt+s",

    “命令”:“宏。runCommandInTerminal”

    }

    1. 分别保存您的用户设置自定义和 keybindings.json

使用保存快捷方式绑定文件格式和缩进

keybindings.json

{
        "key": "cmd+s",
        "command": "macros.saveContentAndIndent",
        "when": "editorTextFocus && !editorReadonly"
    },

User Settings

"macros": {
        "saveContentAndIndent": [
            "editor.action.formatDocument", // format
            "workbench.action.files.save", // as I used Save shorcut, I add the save bind again.
        ],
        //....
}

更新 2
VS Code 现在为集成终端命令提供变量。 https://code.visualstudio.com/updates/v1_32#_variable-support-in-send-sequence-command

如果您想做更强大的任务,例如在后台运行它们(而不是仅向当前终端发送文本),请获取Command Runnermacro-commander扩展

原文
我创建了一个扩展macro-commander来使用非hacky解决方案来解决这个问题。 它是macros扩展的改进版本,按顺序(同步)运行命令,并允许您将文件路径/文件夹路径注入命令。 命令可以在用户的​​ VS Code 终端或隐藏的后台终端中运行。

更新 1
到今天(几个月后)我意识到,令我沮丧的是,有一个现有的扩展可能可以做你(和我)想要的。 它是edonet编写的Command Runner 如果我知道这件事,我可能永远不会延期。

Command Runner 没有那么多通用的可能性(多个命令、用户输入或 javascript),但它具有更好的 UX,并且可能是您(读者)应该首先尝试的扩展。 但是,如果 Command Runner 不能执行您想要的操作,那么宏指令器可能可以,尽管不够优雅。

每当我决定对宏命令进行全面更新时,我都会与 edonet 交谈,看看我们是否可以将功能组合/添加到他的扩展中,在这种情况下,我将更新宏命令自述文件以重定向到他/她延期。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM