问题描述
我正在尝试在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
。看到这个:
但是,在我在VS Code中的%>%
中创建的设置中,我无法将keybindings.json
和data
之间的空格限制为一个空格。在我的设置下,我之间将有两个空格。看到这个:
我读了https://code.visualstudio.com/docs/editor/userdefinedsnippets和https://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时,如果已经有一个前导空格,则插入%>%
,不要有前导空格,而是一个尾随空格。
演示:
唯一不起作用的情况是演示中的情况4,希望对您而言这不是常见的用例-返回文本以插入代码段。它增加了额外的空间,因为光标位于被认为是TM_CURRENT_WORD
的单词之前,并且属于捕获组1。否则,我认为此用例的唯一解决方案是扩展或要求您选择前面的单词第一。