英文:
Disable VS Code command keybinding when Command Palette is open
问题
tl;dr: 如何在命令面板打开时禁用命令绑定?
我正在开发一个创建 Web 视图的扩展。当 Web 视图处于活动状态时,我有一些命令可以通过单个字母且没有修饰键来调用:
"keybindings": [
{
"command": "visual-scxml-editor.toggleEventDisplay",
"key": "e",
"when": "visual-scxml-editor.visualEditorActive"
},
这工作得很好,但是如果用户打开命令面板,他们就不能再键入这些字符。
根据那个链接,我认为这是一个 bug。但是,我不能等待 bug 被修复。(而且,我可以想象一个无论何时命令面板打开并且具有键盘焦点都需要处理键绑定的问题,以至于行为不会被更改的问题。)
我没有看到任何条件上下文允许我在命令面板打开时禁用此绑定。是否有任何事件、回调或其他技巧,可以监听以发现命令面板是打开还是关闭的情况?
我唯一能想到的其他解决方法是对这些命令根本不使用键绑定,而是在 Web 视图中自己处理这些键盘事件:
document.body.addEventListener('keydown', evt => {
switch (evt.code) {
case 'KeyE':
this.toggleEventDisplay();
evt.preventDefault();
break;
}
});
英文:
tl;dr: How can I disable a command keybinding while the Command Palette is open?
I'm developing an extension that makes a webview. When the webview is active, I have some commands that can be invoked by a single letter with no modifiers:
"keybindings": [
{
"command": "visual-scxml-editor.toggleEventDisplay",
"key": "e",
"when": "visual-scxml-editor.visualEditorActive"
},
This works well, except that if the user opens the Command Palette they can no longer type those characters.
Per that link, I feel this is a bug. However, I cannot wait for the bug to be fixed. (And, I can imagine a turtles-all-the-way-down argument that requires keybindings to be processed even when the command palette is open and has keyboard focus, such that the behavior won't ever be changed.)
I don't see a when clause context that would allow me to disable this binding when the command palette is open. Are there any events or callbacks or other tricks I can listen for to discover when the command palette is open vs. closed?
The only other workaround I can think of is to not use keybindings at all for such commands, instead processing these keyboard events myself in the webview:
document.body.addEventListener('keydown', evt => {
switch (evt.code) {
case 'KeyE':
this.toggleEventDisplay();
evt.preventDefault();
break;
}
});
答案1
得分: 0
"listFocus"上下文不适用于命令面板,但"inputFocus"上下文适用。因此,答案就如下所示:
"keybindings": [
{
"command": "visual-scxml-editor.toggleEventDisplay",
"key": "e",
"when": "visual-scxml-editor.visualEditorActive && !inputFocus"
},
英文:
While the listFocus
context does not apply to the command palette, the inputFocus
context does. So, the answer is as simple as:
"keybindings": [
{
"command": "visual-scxml-editor.toggleEventDisplay",
"key": "e",
"when": "visual-scxml-editor.visualEditorActive && !inputFocus"
},
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论