具有特定行为的自定义片段,在 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": " %>% "
}
}
]
在RStudio
IDE中是否有aspace在data
之后,与Ctrl+Shift+M
键绑定,它只在 data
和 %>%
之间插入一个 space。看到这个:
然而,在我在 VS Code 的 keybindings.json
中创建的设置中,我无法将 data
和 %>%
之间的 space 限制为只有一个 space。根据我的设置,中间会有 两个 spaces。看到这个:
通常做你想做的事情是很棘手的,因为 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 前一个词。
我正在尝试在 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中是否有aspace在data
之后,与Ctrl+Shift+M
键绑定,它只在 data
和 %>%
之间插入一个 space。看到这个:
然而,在我在 VS Code 的 keybindings.json
中创建的设置中,我无法将 data
和 %>%
之间的 space 限制为只有一个 space。根据我的设置,中间会有 两个 spaces。看到这个:
通常做你想做的事情是很棘手的,因为 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 前一个词。