在Visual Studio Code中,每个工作区都有一个keybindings.json文件。

47

是否可以将keybindings.json作为工作区设置的一部分而不是用户设置的一部分?

由于我有与我的工作区相关联的特定任务,我也希望能够分配工作区特定的快捷键。因为我会在独立的Windows和Linux环境中使用这些快捷键,所以我不希望看到这些键绑定定义出现在我的环境特定用户设置中。

4个回答

30

这不是一个完美的解决方案,但我找到了一种解决方法,可以创建一个可以在工作区级别激活的按键绑定的变通方法。

在工作区.vscode/settings.json文件中,设置一个新的设置为true。(因为该设置未由VS Code或任何扩展注册,所以它在编辑器中将显示为淡出状态-这没关系):

  "workspaceKeybindings.myAwesomeTask.enabled": true // setting can be anything you want
然后在用户的keybindings.json中创建键盘快捷方式,并为您创建的设置添加一个“when”条件:
{ 
  "key": "ctrl+; ctrl+n",
  "command": "workbench.action.tasks.runTask",
  "args": "My Awesome Task",
  "when": "config.workspaceKeybindings.myAwesomeTask.enabled" // Must be "config.{settingName}"
},

这个快捷键可以在您想要的任何工作区中设置为活动状态。


这拯救了我的整个一天! 运行非常完美。 - 42tg
太棒了!我超喜欢的! - Gabriel
可以为不同的工作区发送不同的 args 吗?例如,我想在一个工作区运行 npm start,在另一个工作区运行 npm run dev,并使用相同的快捷方式。 - Gangula
@Gangula 你想要实现的方法很简单,只需要按照上述所述,在keybindings.json中设置不同的条目即可。一个用于npm start,另一个用于npm run dev,并且在when条件中使用不同的settingName。 - Chris Bain
谢谢@ChrisBain。实际上,我从你的方法和这个答案中获得了灵感,然后想出了一个对我非常有效的不同方法。我将它添加在下面的答案中。 - Gangula
显示剩余3条评论

23

这是不可能的。在这里,Alexandru Dima(alexandrudima)解释了为什么他们不想添加此功能,并建议创建自定义扩展程序,仅贡献按键绑定以共享它们。


4
还有一个问题引起了这个 backlog 里的疑问:https://github.com/Microsoft/vscode/issues/23757 - Ben Creasy
我认为GitHub问题中的解释与问题无关。他解释了为什么他认为共享键绑定没有意义。这很好。但问题不是关于共享,问题是关于在不同的工作区中具有相同快捷键执行不同操作的能力。同样,“创建自定义扩展仅贡献键绑定以共享”这个答案对原始问题没有任何帮助,因为它没有询问关于共享的问题。 - undefined

11
截至2022年7月10日,似乎不可能为每个工作区设置.vscode/keybindings.json,但是可以获取仅在特定文件夹中活动的快捷键绑定:
在您的快捷键绑定文件中,您可以输入:
[
  { 
    "key": "...",
    "command": "..." ,
    "when": "resourceDirname == '/Users/johndoe/path/to/folder'",
    ...
  },
]

您还有所有这些其他上下文:

resource: "vscode-userdata:/Users/johndoe/path/to/file.json"
resourceDirname: "/Users/johndoe/path/to/"
resourceExtname: ".json"
resourceFilename: "file.json"
resourceLangId: "jsonc"
resourcePath: "/Users/johndoe/path/to/file.json"
resourceScheme: "vscode-userdata"

查找所有可能的上下文键:

  1. 运行 Developer: Toggle Developer Tools vscode 命令
  2. 然后运行 Developer: Inspect Context Keys vscode 命令,然后单击任意位置
  3. 在控制台中展开上下文对象,您应该看到完整的上下文键值对列表

and more...


0
我通过使用tasks.json和自定义的全局键盘快捷方式来实现了这一点。我还写了一篇文章详细介绍了整个设置过程。
以下是摘要:
在你的工作空间中创建一个任务,名为startDev,位于.vscode/tasks.json文件中。例如,要运行npm run dev命令,可以按照以下方式设置:
   {
     "label": "startDev",
     "type": "npm",
     "script": "start:host" // 甚至可以使用shell脚本
   }

在全局的keybindings.json文件中添加一个自定义快捷键,如下所示:
{
    "key": "ctrl+shift+/",
    "command": "workbench.action.tasks.runTask",
    "args": "startDev",
},

现在,你可以在所有项目的.vscode/tasks.json中添加一个具有相同标签的任务,并将其替换为你想要的任务。
这种方法是可重复使用和可扩展的。您只需设置一次,就可以在任意数量的项目/工作空间中使用它。
使用tasks.json的另一个好处是,它具有根据操作系统切换命令的标志,并且还可以使用各种终端。 本文详细介绍了这种方法的过程和好处。

这是一个聪明的解决方案,可以使用相同的键盘快捷键在不同的工作区中运行不同的VS Code任务。请注意,第一步(在用户tasks.json中创建任务)并非必需。如果工作区中没有定义具有相同标签的任务,则此任务将作为键绑定的默认任务,但即使没有它,解决方案仍然有效。 - Chris Bain
我不确定我理解你的评论。如果tasks.json没有定义,那么键绑定将无法运行任何任务,对吗? - Gangula
除了在.vscode/tasks.json中为工作区定义任务之外,您还可以通过VS Code用户目录中的tasks.json定义用户级任务。步骤1没有明确说明正在创建的任务是工作区级任务,我错误地将其视为用户级任务。现在我理解了第一步是要创建一个工作区级任务,您是正确的,可以忽略我之前的评论 :-) - Chris Bain
哦,我不知道有用户级任务。谢谢你提供的参考和澄清。 - Gangula

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