Visual studio code 如何在不触发替换的情况下插入Keybinding中的文本
我不熟悉VSCode,我经常需要制作键盘学习序列,这似乎不是VSCode IDE中的事情。根据几家网站的建议,我为marcos做了一个扩展,并一直在制作自定义键绑定作为解决方案 这是一个相当粗糙的过程,因为显然,唯一的命令主列表是在键盘快捷键选项卡中,其次,关于这数百个单独命令的文档很少甚至没有。(特别是,我无法找到每个命令接受的参数的主列表) 无论如何,我已经成功地制作了我需要的自定义键绑定,然而,我一直遇到的一个特殊问题是,我能看到插入特定文本的唯一方法是使用“type”命令,然而,这显然确实尝试键入每个字符,并让键盘样式,等替代自动点火。我不需要也不希望这样,我需要能够阻止它,或者找到其他(实用的)方法来插入我的文本,而不需要任何重新解释、替换或其他键绑定触发(或者任何正在这样做的工具) 以下是我当前的keybinding命令集:Visual studio code 如何在不触发替换的情况下插入Keybinding中的文本,visual-studio-code,vscode-settings,key-bindings,Visual Studio Code,Vscode Settings,Key Bindings,我不熟悉VSCode,我经常需要制作键盘学习序列,这似乎不是VSCode IDE中的事情。根据几家网站的建议,我为marcos做了一个扩展,并一直在制作自定义键绑定作为解决方案 这是一个相当粗糙的过程,因为显然,唯一的命令主列表是在键盘快捷键选项卡中,其次,关于这数百个单独命令的文档很少甚至没有。(特别是,我无法找到每个命令接受的参数的主列表) 无论如何,我已经成功地制作了我需要的自定义键绑定,然而,我一直遇到的一个特殊问题是,我能看到插入特定文本的唯一方法是使用“type”命令,然而,这显然确
"EditLitPropToGet": [
{"command": "type", "args": {"text": "get "}},
"cursorWordRight",
"cursorRightSelect",
{"command": "type", "args": {"text": "() { return "}},
"cursorEnd",
"cursorWordStartLeft",
{"command": "type", "args": {"text": "; }"}},
"cursorWordRight",
"cursorWordRight",
"cursorWordStartLeft"
]
其目的是,当定位在此行第一个单词的开头时:
referenceGravity: this.surfaceGravity * (this.radius**2),
get referenceGravity() { this.surfaceGravity * (this.radius**2); },
然后将其转换为以下行:
referenceGravity: this.surfaceGravity * (this.radius**2),
get referenceGravity() { this.surfaceGravity * (this.radius**2); },
在到达第二个类型
命令之前,该命令工作正常:
{"command": "type", "args": {"text": "() { return "}},
// {"command": "type", "args": {"text": "() { return "}},
{
"command": "editor.action.insertSnippet",
"args": {
"snippet": "() { return }"
}
},
在此运行之前,该行如下所示:
获取参考重力
:this.surfaceGravity*(this.radius**2),
选择冒号字符。上面的type
命令应该执行以下操作:
get referenceGravity() { return this.surfaceGravity * (this.radius**2),
但实际情况是:
get referenceGravity() { return }) this.surfaceGravity * (this.radius**2),
显然,这是因为它将类型
文本视为键盘输入,并触发“()”和“{}”的样式闭包
如何插入文字?
要明确的是,我并不希望每次我想这样做时都必须定义自定义代码段,或者必须预加载粘贴缓冲区,我需要这些键绑定是自包含的
我也不想一开始就盲目地禁用所有扩展、样式等,如果这意味着我必须在最后盲目地启用它们的话。我愿意尝试类似的东西,但是如果我已经禁用了某些东西,那么就不应该重新启用它,因为它不知道以前启用/禁用了什么。如果只是禁用/启用一个特定的设置,没关系,我可以根据需要修改它
为了更新这一点,我接受了@Mark的答案,因为它为这个具体案例提供了解决方案。然而,关于“如何插入文字文本?”这一一般性问题,我相信我终于明白了人们一直在说的话:可以使用
insertSnippet
插入文字文本,只需避开可能被视为Textmate/RegEx命令的内容(“$
”,以及带有“\
”的“`
”)。因此,这应该是可行的:
"EditLitPropToGet": [
{"command": "editor.action.insertSnippet",
"args": {"snippet": "get "}},
"cursorWordRight",
"cursorRightSelect",
{"command": "editor.action.insertSnippet",
"args": {"snippet": "() { return "}},
"cursorEnd",
"cursorWordStartLeft",
{"command": "editor.action.insertSnippet",
"args": {"snippet": "; }"}},
"cursorWordRight",
"cursorWordRight",
"cursorWordStartLeft"
]
为了向您展示代码段如何转换版本,此keybinding:
{
"key": "ctrl+k ctrl+1", // or whatever you want
"command": "editor.action.insertSnippet",
"args": {
"snippet": "get ${TM_SELECTED_TEXT/^(\\w*):(.*),$/$1() {$2/}; },"
}
},
生成所需的输出。您确实需要先选择行,但这可以很容易地在宏中自动执行(或者只绑定cursorLineEndSelect
命令。该宏只有两个命令:cursorLineEndSelect
并插入上述代码段)
使用multi命令的示例宏,我不知道
ctf0的语法。宏
哪个看起来更强大:
"multiCommand.commands": [
{
"command": "multiCommand.yourMacroNameHere",
"interval": 2000,
"sequence": [
"cursorEnd",
"cursorHomeSelect",
{
"command": "editor.action.insertSnippet",
"args": {
"snippet": "get ${TM_SELECTED_TEXT/^\\s*(\\w*):(.*),$/$1() {$2/}; },"
}
},
"cursorDown"
]
},
间隔在您的情况下是不必要的,只是为了观察它的工作情况-它可以被注释掉。光标可以位于包含要转换的行的行上的任何位置。它不需要预先选择,宏将为您执行此操作
为了以防万一,我会在做了这些更改之后重新加载vscode(通过命令选项板)
同样,演示看起来很慢,但这只是为了演示使用interval
选项的各个步骤。否则它是即时的
如果要使用宏,请使用insertSnippet
命令代替该type
命令:
{"command": "type", "args": {"text": "() { return "}},
// {"command": "type", "args": {"text": "() { return "}},
{
"command": "editor.action.insertSnippet",
"args": {
"snippet": "() { return }"
}
},
这似乎不会触发自动关闭大括号。代码段确实需要比type
命令转义更多的字符,但在您的情况下不需要转义。为了向您展示代码段如何转换版本,此键绑定:
{
"key": "ctrl+k ctrl+1", // or whatever you want
"command": "editor.action.insertSnippet",
"args": {
"snippet": "get ${TM_SELECTED_TEXT/^(\\w*):(.*),$/$1() {$2/}; },"
}
},
生成所需的输出。您确实需要先选择行,但这可以很容易地在宏中自动执行(或者只绑定cursorLineEndSelect
命令。该宏只有两个命令:cursorLineEndSelect
并插入上述代码段
使用multi命令的示例宏,我不知道ctf0的语法。宏
哪个看起来更强大:
"multiCommand.commands": [
{
"command": "multiCommand.yourMacroNameHere",
"interval": 2000,
"sequence": [
"cursorEnd",
"cursorHomeSelect",
{
"command": "editor.action.insertSnippet",
"args": {
"snippet": "get ${TM_SELECTED_TEXT/^\\s*(\\w*):(.*),$/$1() {$2/}; },"
}
},
"cursorDown"
]
},
间隔在您的情况下是不必要的,只是为了观察它的工作情况-它可以被注释掉。光标可以位于包含要转换的行的行上的任何位置。它不需要预先选择,宏将为您执行此操作
为了以防万一,我会在做了这些更改之后重新加载vscode(通过命令选项板)
同样,演示看起来很慢,但这只是为了演示使用interval
选项的各个步骤。否则它是即时的
如果要使用宏,请使用insertSnippet
命令代替该type
命令:
{"command": "type", "args": {"text": "() { return "}},
// {"command": "type", "args": {"text": "() { return "}},
{
"command": "editor.action.insertSnippet",
"args": {
"snippet": "() { return }"
}
},
这似乎不会触发自动关闭大括号。代码段确实需要转义的字符比type
命令转义的字符多,但不是在您的情况下。我只是猜测,但请尝试“命令”:“editor.action.insertSnippet”,“args”:{“snippet”:“your_text_here”},
。还有,什么ext