我正在try 编写一个脚本,将用户的键盘快捷键转换为抽认卡.基本上,我想 for each 快捷键列出一个列表(快捷方式,动作标题).

当我打开默认快捷键JSON时,我看到每个快捷键的(键、命令、时间).例如:

{ "key": "escape escape", "command": "workbench.action.exitZenMode", "when": "inZenMode" },

这很完美,只是我希望命令是人类可读的.当我打开"键盘快捷键"编辑器时,快捷键按英文名称列出,例如:

"将光标添加到上方"-"Ctrl+Alt+UpArrow"-"editorTextFocus"

这是我想要的,但我不能出口这些.

我翻遍了GitHub上的回购.看起来每个命令都是在各自的文件中定义的,每个命令都有一个名为title的属性,其中包含英文名称,但我无法理解键盘快捷键编辑器如何访问每个命令并显示它们的标题(我不是一个打字专家).获取键盘命令英文名称列表的最佳方式是什么?

推荐答案

首先,我非常确定您实际上并不想要缺省键绑定JSON伪文件的内容.我假设,如果你想要抽认卡,你想帮助别人记住their个键绑定,以及他们对它们所做的任何定制.

我不知道什么是容易的or脚本,但是...下面是(我现在能想到的最好的):

  1. 启用并激活提供您希望成为结果一部分的键绑定的所有扩展.扩展有激活事件(因此,除非实际需要,否则不会加载它们).

  2. 打开VS代码开发工具(command palette中的Developer: Toggle Developer Tools)

  3. 打开"Sources"选项卡,然后打开"Electron Isolated Context">;".../Resources/app"(或VS代码安装的任何应用程序资源路径)>;out/vs/workbench/workBench.desktop.main.js.

  4. ctrl/cmd+f并搜索getKeybindings() {并在结果上放置断点.前男友.对我来说,我得到了两个搜索结果,并将断点放在这里(您可能会看到一些略有不同的东西,因为这是缩小的代码):

    getKeybindings() {
        return this.e // <- put breakpoint here
    }
    

    断点将在代码的美化/源代码映射(?)视图中呈现.

  5. 返回到实际的VS代码窗口,现在打开键盘快捷键UI(命令面板中的Preferences: Open Keyboard Shortcuts).这应该会触发断点.

  6. 在DevTools的"Sources"选项卡中,按两次"Step out of Current Function"按钮,应该会进入一个名为resolve in keybindingsEditorModel.ts的函数.

  7. 右键单击声明为const commandsWithDefaultKeybindings的行,然后单击"继续到此处".请注意,如果您实际上希望获得默认键绑定,而不是用户键绑定+未被覆盖的默认键绑定,那么接下来的for循环就是初始化所需数据的循环.

  8. 在右侧边栏的"Scope"部分的"Local"部分下,查找一个值为this的属性,该属性是一个包含(可能有很多)内容的array.属性名称将被缩小.在原始源代码中,我们要找的东西的名称是_keybindingItemsSortedByPrecedence.找到它后,右击它并 Select "将对象存储为全局变量".您将在控制台面板中看到一个新变量,其名称可能类似于temp1.

  9. 在控制台中,运行temp1.map(e => ({command:e.commandLabel,keyChord:e.keybindingItem.chords})).filter(e=>e.command!=="")(或者您想要获得您想要的属性的任何转换,并且以您想要的任何格式),筛选器删除只有""作为标签的映射.我认为这些映射只是用于没有绑定到命令的键,并且只需要"插入"它们自己/做它们在任何应用程序中会做的正常事情.

  10. 在结果上单击鼠标右键并 Select "复制对象".

  11. 在调试器中单击"继续"

  12. 将剪贴板内容粘贴到您想要的任何位置,并随心所欲地处理结果(这是JSON).

如果有/我可以找到一个扩展API来获取键绑定,这可能会容易得多,但我找了一下,但没有找到.(也许我只是错过了?)

如果您想要按源代码(注册键绑定的内容)进行过滤,那么您也可以这样做.前男友.要筛选用户编写的键绑定:temp1.filter(e=>e.source==="User") ....要获取来源列表,请使用new Set(temp1.map(e=>e.source)).请注意,有些源是对象而不是字符串(例如对象关于扩展源,而不是"System""User").

Typescript相关问答推荐

如何从TypScript中的接口中正确获取特定键类型的所有属性?

为什么在TypScript中写入typeof someArray[number]有效?

从接口创建类型安全的嵌套 struct

类型安全JSON解析

忽略和K的定义

具有泛型类方法的类方法修饰符

我想创建一个只需要一个未定义属性的打字脚本类型

角效用函数的类型推断

在实现自定义主题后,Angular 不会更新视图

我可以使用TypeScrip从字符串词典/记录中填充强类型的环境对象吗?

是否可以基于对象的S属性值[]约束对象的其他属性值用于类型化的对象数组?

Select 下拉菜单的占位符不起作用

APP_INITIALIZER在继续到其他Provider 之前未解析promise

如何使这种一对一关系在旧表上起作用?

接口中可选嵌套属性的类型判断

来自枚举的<;复选框和组件列表

可以将JS文件放在tsconfig';s includes/files属性?或者,我如何让tsc判断TS项目中的JS文件?

如何知道使用TypeScript时是否在临时工作流内运行

如何根据Typescript 中带有泛型的对象嵌套键数组获取数组或对象的正确类型?

显式推断元组类型