Visual studio code VS代码中具有键绑定的特定行为的自定义代码段

Visual studio code VS代码中具有键绑定的特定行为的自定义代码段,visual-studio-code,customization,vscode-snippets,Visual Studio Code,Customization,Vscode Snippets,我试图在VS代码中插入一个带有键绑定的代码段%>% 示例代码: data %>% select() 在keybindings.json // Place your key bindings in this file to override the defaults [ { "key": "Ctrl+Shift+M", "command": "editor.action.inser

我试图在VS代码中插入一个带有键绑定的代码段
%>%

示例代码:

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": " %>% "
        }
      }
]
RStudio
IDE中,无论
data
之后是否有a空格,使用
Ctrl+Shift+M
键绑定,它只在
data
%>%
之间插入一个空格。见此:

但是,在VS code中我在
keybindings.json
中创建的设置中,我无法将
数据
%>%
之间的空间限制为仅一个空间。在我的设置中,中间有两个空格。见此:

我读了,但还是忍不住。
我怎么可能将空间限制为单个空间呢?

一般来说,要想做你想做的事情是很棘手的,因为vscode代码片段只插入光标是否是,但你不能删除光标之前的内容。如果您选择前面的单词,比如您的案例中的
data
,这将很容易做到,但您可能不想这样做

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

{
  "key": "Ctrl+Shift+M",
  "command": "editor.action.insertSnippet",
  "when": "editorTextFocus",
  "args": {
    "snippet": "${TM_CURRENT_WORD/(.*)/${1:? %>% :%>% }/}"
  }
},
触发光标时,此代码段将查看光标下的
单词。如果有一个单词,比如当光标正好在一个计数的单词后面时,就会有一个捕获组1。如果没有单词,例如如果您首先输入了空格,并且空格被视为
单词
,显然是为了
TM\u CURRENT\u word
,则将不存在捕获组1

替换文本为
${1:?%%>%:%%>%}
,这是一个条件替换,表示:如果有捕获组1,则案例没有空格,请插入带有一个前导和尾随空格的
%%
。否则,在捕获组1时,如果已经有一个前导空格,则插入
%%>%%
,但不包含前导空格,而是包含一个尾随空格

演示:


唯一一种情况是演示中的案例4不能像您所希望的那样工作,这对您来说可能不是一个常见的用例-返回到文本中插入您的代码片段。它添加了额外的空间,因为光标正好位于被视为
TM\u当前\u单词的单词
,并且属于捕获组1。否则,我认为这个用例的唯一解决方案是扩展,或者要求您首先选择前面的单词。

为我的用例做这项工作。也希望看到案例4的解决方案。非常感谢。