【问题标题】:How to Insert Literal Text from a Keybinding, without Triggering Substitutions如何在不触发替换的情况下从键绑定中插入文字
【发布时间】:2020-08-03 04:47:48
【问题描述】:

我是 VSCode 的新手,我经常需要让键盘学习序列,这在 VSCode IDE 中似乎不是一个东西。根据几个网站的建议,我得到了一个 marcos 的扩展,并一直在制作自定义键绑定作为一种解决方法。

这一直很艰难,因为显然,唯一的主要命令列表在键盘快捷键选项卡中,其次,关于这数百个单独的命令几乎没有文档。 (特别是,我无法找到任何每个命令接受的参数的主列表)。

无论如何,我在制作我需要的自定义键绑定方面取得了一些成功,但是,我一直遇到的一个特殊问题是,我可以看到插入特定文字的唯一方法是使用 “type” 命令,然而,这显然确实尝试键入每个字符,并让键盘样式等替换自动触发。我不需要也不想要这个,我需要能够阻止它,或者找到一些其他(实用的)方法来插入我的文字文本,而不需要 any 重新解释、替换或其他键绑定触发(或其他设施正在这样做)。

这是我当前的键绑定命令集:

    "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); },

这工作正常,直到它到达第二个type 命令:

        {"command": "type", "args": {"text": "() { return "}},

在此运行之前,该行如下所示:

get referenceGravity: this.surfaceGravity * (this.radius**2),

选中冒号字符。上面的type 命令应该是这样的:

get referenceGravity() { return  this.surfaceGravity * (this.radius**2),

但实际发生的是这样的:

get referenceGravity() { return }) this.surfaceGravity * (this.radius**2),

显然,这是因为它将type 文本视为键盘输入,并触发了“()”和“{}”的样式闭包。

我怎样才能只插入文字?

明确地说,我不希望每次我想这样做时都必须定义一个自定义的 sn-p,或者必须预加载粘贴缓冲区,我需要这些键绑定是独立的。

我也不想在一开始就盲目地禁用所有扩展、样式等,如果这意味着我必须在最后盲目地启用它们。我愿意尝试类似的东西,但是如果我已经禁用了某些东西,那么它不应该重新启用它,因为它不知道以前启用/禁用了什么。如果它只是禁用/启用一个特定设置,那很好,我可以根据需要进行更正。


只是为了更新这一点,我接受了@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"
    ]

【问题讨论】:

  • 我只是猜测,但请尝试"command": "editor.action.insertSnippet", "args": {"snippet": "your_text_here"},。另外,您使用什么扩展程序通过单个热键执行多个命令?
  • 您似乎需要禁用Editor: Auto Closing Brackets。另外我不建议使用macros 扩展——它不是同步的,也没有维护。看看它的问题。
  • @HolyBlackCat 不会尝试使用该名称运行 sn-p 吗?哦,我使用的扩展是 geddski 的“宏”(geddski.macros 是扩展标识符)。
  • @Mark 嗯,我认为这是有问题的前世。你能建议一个替代方案吗?另外,我会尽快尝试您的建议,但我仍然很想知道如何插入文字。
  • @Mark 等等,我不知道你是如何禁用键绑定命令的设置的?

标签: visual-studio-code vscode-settings key-bindings


【解决方案1】:

只是为了向你展示sn-p如何转换版本,这个键绑定:

{
  "key": "ctrl+k ctrl+1",             // or whatever you want
  "command": "editor.action.insertSnippet",
    "args": {
      "snippet": "get ${TM_SELECTED_TEXT/^(\\w*):(.*),$/$1() {$2/}; },"
  }
},

产生你想要的输出。您确实必须先选择该行,但这可以很容易地在宏中自动执行(或者只需绑定cursorLineEndSelect 命令。该宏将只有两个命令:cursorLineEndSelect 并插入上面的 sn-p。


使用多命令的示例宏,我不知道ctf0.macros 的语法看起来更强大:

 "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"
      ]
    },

interval 在您的情况下是不必要的,只是在那里观看它的工作 - 它可以被注释掉。光标可以位于包含要转换的行的行上的任何位置。它不需要预先选择,宏会为您完成。

为了以防万一,我会在进行这些更改后重新加载 vscode(通过命令面板)。

同样,该演示看起来很慢,但这只是为了演示使用interval 选项的各个步骤。否则它是瞬时的。


如果你想使用你的宏,那么使用insertSnippet 命令代替那个type 命令:

    // {"command": "type", "args": {"text": "() { return "}},
    {
      "command": "editor.action.insertSnippet",
      "args": {
        "snippet": "() { return }"
      }
    },

这似乎不会触发自动闭合大括号。与 type 命令相比,片段确实需要转义更多字符 - 但在您的情况下不是。

【讨论】:

  • “get ...”后面的内容是什么?这是对 sn-ps 的某种正则表达式搜索和替换吗?
  • 是的,sn-ps 允许您在这种情况下对内置变量 TM_SELECTED_TEXT 进行“转换”。见code.visualstudio.com/docs/editor/…。您可以使用正则表达式解析该变量,然后对捕获组执行各种操作。它可以是一个非常强大的工具 - 我已经回答了很多关于它的 SO 问题,替代方案是编写扩展。
  • 我正在尝试这个并且遇到了问题。只要它是我宏中的最后一个命令,它就可以正常工作。但我希望它也移动到下一行,当我添加一个命令来执行此操作时(“cursorWordRight”)而不是转换选定的行,它只是在它之后添加一个带有get ; }, 的新行。我是否需要明确终止 sn-p 操作或其他内容?
  • 您也可以查看扩展“multi command”。
  • 我修改了答案以显示命令序列 - 您的宏语法可能不同。午饭后我会发布一个演示:>}
猜你喜欢
  • 2022-08-16
  • 2012-11-26
  • 2011-02-04
  • 2019-01-25
  • 2011-07-10
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多