具有特定行为的自定义片段,在 VS 代码中具有键绑定

Custom snippets with a specific behavior with a keybinding in VS Code

我正在尝试在 VS Code 中插入带有键绑定 Ctrl+Shift+M 的片段 %>%

示例代码:

data %>% select()

我能够通过keybindings.json

中的这个设置实现这个(不太满意
// Place your key bindings in this file to override the defaults
[
    {
        "key": "Ctrl+Shift+M",
        "command": "editor.action.insertSnippet",
        "when": "editorTextFocus",
        "args": {
          "snippet": " %>% "
        }
      }
]

RStudioIDE中是否有aspace在data之后,与Ctrl+Shift+M 键绑定,它只在 data%>% 之间插入一个 space。看到这个:

然而,在我在 VS Code 的 keybindings.json 中创建的设置中,我无法将 data%>% 之间的 space 限制为只有一个 space。根据我的设置,中间会有 两个 spaces。看到这个:

我读了 this, and this 但无能为力。 我怎么可能将 space 限制为只有一个 space?

通常做你想做的事情是很棘手的,因为 vscode 片段只是插入光标是否是 - 但你不能删除光标之前的东西。如果您 select 编辑了前面的单词,这将很容易做到,例如 data 在您的情况下,但您可能不想这样做。

但是使用条件替换是可能的:

{
  "key": "Ctrl+Shift+M",
  "command": "editor.action.insertSnippet",
  "when": "editorTextFocus",
  "args": {
    "snippet": "${TM_CURRENT_WORD/(.*)/${1:? %>% :%>% }/}"
  }
},

当您触发它时,此代码片段会查看光标下方的 word。如果有一个单词,比如当光标正好在一个重要的单词之后,就会有一个捕获组 1。如果没有单词,比如你先输入一个 space 然后输入一个 space被认为是 word 显然是出于 TM_CURRENT_WORD 的目的,不会有捕获组 1.

替换文本是 ${1:? %>% :%>% },这是一个有条件的替换,它说:如果有捕获组 1,没有 space 的情况,插入 %>% ,前导和尾随 space。否则当捕获第 1 组时,已经有一个前导 space,插入 %>% ,没有前导 space,但有一个尾随 space。

演示:

唯一不能按您希望的那样工作的情况是演示中的情况 4,希望这对您来说不是常见的用例 - 返回文本以插入您的代码段。它添加了额外的 space 因为光标就在一个被认为是 TM_CURRENT_WORD 并且属于捕获组 1 的单词之前。否则我认为这个用例的唯一解决方案是扩展或需要你到 select 前一个词。