VS Code:如何将片段占位符从驼峰式转换为 SCREAMING_SNAKE_CASE?
VS Code: How to convert snippet placeholder from camelCase to SCREAMING_SNAKE_CASE?
我想创建一个用于创建 redux reducer 的 VS Code 片段。
我想要一个带有占位符的片段,它需要驼峰式命名,然后将匹配的占位符转换为 SCREAMING_SNAKE_CASE。
这是我尝试的代码片段,它不起作用:
"test": {
"prefix": "test",
"body": " -> ${1/([a-zA-Z])(?=[A-Z])/${1:/upcase}_/g}"
},
这会产生不想要的结果:
changeNetworkStatus -> changE_NetworK_Status
期望流量
- 键入
test
(片段名称)
- 点击 tab 加载代码段。
键入 changeNetworkStatus
得到:
changeNetworkStatus -> changeNetworkStatus
点击 tab 以获得预期结果:
changeNetworkStatus -> CHANGE_NETWORK_STATUS
如何更改我的代码片段以获得所需的结果?
更新:键绑定版本:
VScode 在 v1.53 中添加了 editor.action.transformToSnakecase
,因此可以更轻松地完成请求的操作,而无需找出必要的正则表达式来使其工作,如上一个答案所示。而且因为有些人可能会发现这个问题是在寻找蛇案(snake-case)的信息。
然而,我现在展示的不是片段。您只需键入文本,然后触发键绑定。键绑定本身会从 multi-command 扩展中触发宏扩展命令。在 keybindings.json
:
{
"key": "alt+3", // whatever keybinding you wish
"command": "extension.multiCommand.execute",
"args": {
"sequence": [
"cursorWordLeftSelect", // select word you just typed
"editor.action.transformToSnakecase",
"editor.action.transformToUppercase",
// "cursorLineEnd" // if you want this
]
},
"when": "editorTextFocus && !editorHasSelection"
},
键绑定版本演示:
片段版本:
"camelCaseModify": {
"prefix": "test",
"body": [
// first inefficient try, works for up to three words
// " -> ${1/^([a-z]*)([A-Z])([a-z]+)*([A-Z])*([a-z]+)*/${1:/upcase}_${3:/upcase}${4:+_}${5:/upcase}/g}"
" -> ${1/([a-z]*)(([A-Z])+([a-z]+))?/${1:/upcase}${2:+_}${4:/upcase}/g}",
// here is an especially gnarly version to handle edge cases like 'thisISABCTest' and trailing _'s
" -> ${1/([a-z]+)(?=[A-Z])|([A-Z])(?=[A-Z])|([A-Z][a-z]+)(?=$)|([A-Z][a-z]+)|([a-z]+)(?=$)/${1:/upcase}${1:+_}${2:+_}${3:/upcase}${4:/upcase}${4:+_}${5:/upcase}/g}"
],
"description": "underscore separators"
},
这适用于任意数量的驼峰式单词,从一到无穷...
${2:+_}
的意思是“如果有一个捕获组 2 则追加一个下划线。”如果没有第二个 word/capture 组,那么第 3 组和第 4 组无论如何都将是空的,因为它们在捕获组 2 中。捕获组 2 始终是下一个单词(以一个大写字母开头,后跟至少一个小写字母)。
例如,使用 changeNetworkStatus
:
Match 1
Full match 0-13 `changeNetwork`
Group 1. 0-6 `change`
Group 2. 6-13 `Network`
Group 3. 6-7 `N`
Group 4. 7-13 `etwork`
Match 2
Full match 13-19 `Status`
Group 1. 13-13 ``
Group 2. 13-19 `Status`
Group 3. 13-14 `S`
Group 4. 14-19 `tatus`
Match 3
Full match 19-19 ``
Group 1. 19-19 ``
示例输出:
abcd -> ABCD
twoFish -> TWO_FISH
threeFishMore -> THREE_FISH_MORE
fourFishOneMore -> FOUR_FISH_ONE_MORE
fiveFishTwoMoreFish -> FIVE_FISH_TWO_MORE_FISH
sixFishEelsSnakesDogsCatsMiceRatsClocksRocks -> SIX_FISH_EELS_SNAKES_DOGS_CATS_MICE_RATS_CLOCKS_ROCKS
使用 regex101.com 确实有助于可视化正在发生的事情!
我想创建一个用于创建 redux reducer 的 VS Code 片段。
我想要一个带有占位符的片段,它需要驼峰式命名,然后将匹配的占位符转换为 SCREAMING_SNAKE_CASE。
这是我尝试的代码片段,它不起作用:
"test": {
"prefix": "test",
"body": " -> ${1/([a-zA-Z])(?=[A-Z])/${1:/upcase}_/g}"
},
这会产生不想要的结果:
changeNetworkStatus -> changE_NetworK_Status
期望流量
- 键入
test
(片段名称) - 点击 tab 加载代码段。
键入
changeNetworkStatus
得到:changeNetworkStatus -> changeNetworkStatus
点击 tab 以获得预期结果:
changeNetworkStatus -> CHANGE_NETWORK_STATUS
如何更改我的代码片段以获得所需的结果?
更新:键绑定版本:
VScode 在 v1.53 中添加了 editor.action.transformToSnakecase
,因此可以更轻松地完成请求的操作,而无需找出必要的正则表达式来使其工作,如上一个答案所示。而且因为有些人可能会发现这个问题是在寻找蛇案(snake-case)的信息。
然而,我现在展示的不是片段。您只需键入文本,然后触发键绑定。键绑定本身会从 multi-command 扩展中触发宏扩展命令。在 keybindings.json
:
{
"key": "alt+3", // whatever keybinding you wish
"command": "extension.multiCommand.execute",
"args": {
"sequence": [
"cursorWordLeftSelect", // select word you just typed
"editor.action.transformToSnakecase",
"editor.action.transformToUppercase",
// "cursorLineEnd" // if you want this
]
},
"when": "editorTextFocus && !editorHasSelection"
},
键绑定版本演示:
片段版本:
"camelCaseModify": {
"prefix": "test",
"body": [
// first inefficient try, works for up to three words
// " -> ${1/^([a-z]*)([A-Z])([a-z]+)*([A-Z])*([a-z]+)*/${1:/upcase}_${3:/upcase}${4:+_}${5:/upcase}/g}"
" -> ${1/([a-z]*)(([A-Z])+([a-z]+))?/${1:/upcase}${2:+_}${4:/upcase}/g}",
// here is an especially gnarly version to handle edge cases like 'thisISABCTest' and trailing _'s
" -> ${1/([a-z]+)(?=[A-Z])|([A-Z])(?=[A-Z])|([A-Z][a-z]+)(?=$)|([A-Z][a-z]+)|([a-z]+)(?=$)/${1:/upcase}${1:+_}${2:+_}${3:/upcase}${4:/upcase}${4:+_}${5:/upcase}/g}"
],
"description": "underscore separators"
},
这适用于任意数量的驼峰式单词,从一到无穷...
${2:+_}
的意思是“如果有一个捕获组 2 则追加一个下划线。”如果没有第二个 word/capture 组,那么第 3 组和第 4 组无论如何都将是空的,因为它们在捕获组 2 中。捕获组 2 始终是下一个单词(以一个大写字母开头,后跟至少一个小写字母)。
例如,使用 changeNetworkStatus
:
Match 1
Full match 0-13 `changeNetwork`
Group 1. 0-6 `change`
Group 2. 6-13 `Network`
Group 3. 6-7 `N`
Group 4. 7-13 `etwork`
Match 2
Full match 13-19 `Status`
Group 1. 13-13 ``
Group 2. 13-19 `Status`
Group 3. 13-14 `S`
Group 4. 14-19 `tatus`
Match 3
Full match 19-19 ``
Group 1. 19-19 ``
示例输出:
abcd -> ABCD
twoFish -> TWO_FISH
threeFishMore -> THREE_FISH_MORE
fourFishOneMore -> FOUR_FISH_ONE_MORE
fiveFishTwoMoreFish -> FIVE_FISH_TWO_MORE_FISH
sixFishEelsSnakesDogsCatsMiceRatsClocksRocks -> SIX_FISH_EELS_SNAKES_DOGS_CATS_MICE_RATS_CLOCKS_ROCKS
使用 regex101.com 确实有助于可视化正在发生的事情!