具有特定行为的自定义片段,带有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": " %>% "
        }
      }
]

RStudio IDE中,是否在data后是否有 a 空格,通过Ctrl+Shift+M键绑定,它仅在{{1 }}和data。看到这个:

enter image description here

但是,在我在VS Code中的%>%中创建的设置中,我无法将keybindings.jsondata间的空格限制为一个空格。在我的设置下,我之间将有两个空格。看到这个:

enter image description here

我读了https://code.visualstudio.com/docs/editor/userdefinedsnippetshttps://code.visualstudio.com/docs/getstarted/keybindings#_advanced-customization,但无济于事。 我怎么可能将空间限制为单个空间?

解决方法

通常,执行所需的操作很棘手,因为vscode代码片段仅插入光标是否为-,但是您不能删除光标之前的内容。如果您选择了前面的单词(例如data)会很容易,但是您可能不想这样做。

但是使用条件替换可以:

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

触发该代码段时,它将查看光标下方的word。如果有一个单词(例如,当光标紧接在一个要计数的单词之后),则将有一个捕获组1。如果没有单词(例如,如果您首先输入一个空格并将一个空格视为word显然出于TM_CURRENT_WORD的目的,将没有捕获组1。

替换文本为${1:? %>% :%>% },它是一个有条件的替换,其内容为:如果存在捕获组1,则该案例没有空格,请插入 %>% ,并在其前后加上一个空格。否则,当捕获组1时,如果已经有一个前导空格,则插入%>% ,不要有前导空格,而是一个尾随空格。

演示:

demo of snippet with/without spaces

唯一不起作用的情况是演示中的情况4,希望对您而言这不是常见的用例-返回文本以插入代码段。它增加了额外的空间,因为光标位于被认为是TM_CURRENT_WORD的单词之前,并且属于捕获组1。否则,我认为此用例的唯一解决方案是扩展或要求您选择前面的单词第一。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...