在 VSCode 用户代码片段中将 Pascal 大小写转换为 Kebab 大小写

Nai*_*ith 3 regex visual-studio-code

我目前正在尝试编写一个用户片段,该片段将采用变量${1}(例如 JobsSummary)并将其转换为 Kebab 案例(jobs-summary)。

"Example": {
    "prefix": "test",
    "body": [
      "${1}",
      "${1} -> ${1/(^.)+([A-Z])+/${1:/downcase}/}"
    ]
}
Run Code Online (Sandbox Code Playgroud)

将 Visual Studio 代码用户片段中的变量从 Pascal Case 转换为 Kebab Case 的正确方法是什么?

JobsSummary->jobs-summary

AnotherExampleOfSomething->another-example-of-something

Mar*_*ark 7

从 vscode v1.69 开始更新:添加了一个新命令:

Transform to Kebab Case
editor.action.transformToKebabcase
Run Code Online (Sandbox Code Playgroud)

默认情况下它是未绑定的,以便在您的keybindings.json

Transform to Kebab Case
editor.action.transformToKebabcase
Run Code Online (Sandbox Code Playgroud)

先前的答案,在上述新命令之前。

这有效:

"Example": {
  "prefix": "psc",
  "body": [
    "${1}",
    "${1} -> ${1/([A-Z][a-z]*)([A-Z][a-z]*)?([A-Z][a-z]*)?([A-Z][a-z]*)?/${1:/downcase}${2:+-}${2:/downcase}${3:+-}${3:/downcase}${4:+-}${4:/downcase}/}"
  ],
  "description": "Convert from PascalCase to kebab-case"
},
Run Code Online (Sandbox Code Playgroud)

通常我能够让它们在更短的版本中工作 - 使用全局修饰符 - 因此对于任意数量的“单词”。但在这种情况下我无法这样做。上面的内容是最多四个“单词”的硬编码,例如PascalCaseThreeFour.

它适用于一到四个“单词”,但不适用于更多单词,但您可以轻松修改任意数量的单词。添加更多的转换有一个明显的模式。

您在上面看到的构造${3:+-}意味着如果存在捕获组 3,请添加连字符。

编辑:以下简化将处理 PascalCase 中的任意数量的单词:

"${1} -> ${1/([A-Z][a-z]+)/${1:/downcase}-/g}$0"
Run Code Online (Sandbox Code Playgroud)

但会导致-像这样的尾随:

PascalCaseThreeFourFive->pascal-case-three-four-five- 如果您不介意在尾随破折号上退格-。否则,很容易将此片段合并到中,然后删除最后一个破折号。

另外,更改大小写扩展可能对您有用 - 它看起来有一个 kebab-case 命令。


更新:

请参阅我的答案,了解一个非常强大的工作示例,该示例可以处理许多情况,包括大写序列和许多其他奇怪的情况:

"snake": {
  "prefix": "snake",
  "body": "${TM_SELECTED_TEXT/([A-Z]{2,})(?=[A-Z][a-z]+[0-9]*|$)|([A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+)([- _])?/${1:/downcase}${2:/downcase}${2:+_}/gm}"
}, 
Run Code Online (Sandbox Code Playgroud)


max*_*xim 6

这适用于 PascalCase 中的任意数量的单词并且没有尾随破折号:

"${TM_SELECTED_TEXT} -> ${TM_SELECTED_TEXT/(^[A-Z][a-z]*|[a-z])([A-Z])?/${1:/downcase}${2:+-}${2:/downcase}/g}"
Run Code Online (Sandbox Code Playgroud)

这将产生类似这样的结果:

AnotherExampleOfSomething -> another-example-of-something
Run Code Online (Sandbox Code Playgroud)

唯一的问题是,它不喜欢大写序列,例如首字母缩略词(只有第一个字符会小写)。然而,它可能只适用于 2 个字母的缩写,因为根据规则,较长的缩写词无论如何都应该使用驼峰/帕斯卡大小写(这很好用)。