VS Code 片段转换中的条件插入

问题描述 投票:0回答:1

我想为 Markdown 文件创建 VS Code 片段。该代码片段应采用文件名(例如:

12.3-Test_me.md
)并将其转换为类似
Test Me
的内容,既不带前导数字,也不带扩展名,并将下划线替换为空格。

但是,我无法用空格替换下划线。

TextMate 片段的文档承诺:

我们还可以在格式字符串中使用条件插入来做出决定。

给出的条件插入的例子是

${1/void$|(.+)/(?1:\n\treturn nil;)/}

VS Code 中可以进行条件插入吗?我所有在代码片段中向正则表达式添加一条线索的尝试都失败了。我只想检查捕获组 4 是否包含任何字符,在这种情况下我想将其替换为空格,因此在代码片段的第三部分中,我尝试使用:

${4/(.+)/(?1: )/}

下面是我用来理解正在发生的事情的片段。第一部分展示了如何应用正则表达式,第二部分是迄今为止我在生成我想要的输出方面的最佳尝试。第三部分显示了我使用条件插入的失败尝试。

VS 代码片段

"test": {
  "prefix": "xxx",
    "body": [
        "Input: $TM_FILENAME\nTreatment:\n\n${TM_FILENAME/(^[0-9 _\\.-]+)|((\\w+)([ _-]))|(\\w+)|(\\.md$)/1: '$1'\n2: '$2'\n3: '$3'\n4: '$4'\n5: '${5:/capitalize}'\n6: '$6'\n\n/g}------\n",
        "Output:\n'${TM_FILENAME/(^[0-9 _\\.-]+)|((\\w+)([ _-]))|(\\w+)|(\\.md$)/$3${4: }${5:/capitalize}/g}'\n(expected: 'Test Me')\n\n------\n",
        "Fails:\n'${TM_FILENAME/(^[0-9 _\\.-]+)|((\\w+)([ _-]))|(\\w+)|(\\.md$)/$3${4/(.+)/(?1: )/}${5:/capitalize}/g}"
    ],
    "description": "Create title from file name"
}

输出

这是当我将代码片段应用到名为

12.3-Test_me.md
的文件时产生的结果:

Input: 12.3-Test_me.md
Treatment:

1: '12.3-'
2: ''
3: ''
4: ''
5: ''
6: ''

1: ''
2: 'Test_'
3: 'Test'
4: '_'
5: ''
6: ''

1: ''
2: ''
3: ''
4: ''
5: 'Me'
6: ''

1: ''
2: ''
3: ''
4: ''
5: ''
6: '.md'

------

Output:
' Test_ Me '
(expected: 'Test Me')

------

Fails:
'${TM_FILENAME/(^[0-9 _\.-]+)|((\w+)([ _-]))|(\w+)|(\.md$)/ (?1: )/}/capitalize/g}
conditional-statements insertion vscode-snippets
1个回答
0
投票

以下代码片段执行以下操作。

输入:12.3-Test_me.md
输出:测试我

片段:

"transform2":{
        "prefix": "transform2"
        ,"body": ["${CLIPBOARD/(\\d*\\.*\\d-)(\\w*)_(\\w*)(\\.\\w*)/${2} ${3:/capitalize}/g}"]
        ,"description": ""
    }

详情:

我使用

CLIPBOARD
变量而不是
TM_FILENAME
只是为了便于测试。
这样我就可以通过复制输入字符串然后触发
trasnform2
代码片段来测试代码片段,而不必处理文件名。
但是您可以将
TM_FILENAME
替换为
CLIPBOARD
,它将使用文件名而不是剪贴板中的文本。

此代码片段将输入字符串分为 4 组。

  1. (\\d*\\.*\\d-)
    =>“12.3-”
  2. (\\w*)
    =>“测试”
  3. _(\\w*)
    => “我”
    • 请注意,“_”位于 ( ) 之外,因此它不包含在第三组中
  4. (\\.\\w*)
    =>“.md”

现在我们已将字符串分为 4 个组,我们可以编写“格式字符串”(或替换字符串)部分,这是第二个

/

之后的部分

格式字符串:

${2} ${3:/capitalize}

  • ${2}
    =>“测试”
  • ${3:/capitalize}
    => “我”
    • /capitalize
      将第一个字母大写。把“我”变成“我”。

注:
${2} 和 ${3} 之间的文字空格字符。

我认为在这种情况下要理解的主要部分是,当我们使用

_
来帮助捕获
_
之前和之后的分组时。
Test_me

实际的

_
字符既不是 group2 也不是 group3 的一部分,因为我们将其留在指定分组文本的
(
括号
)
之外。

您可能仍需要进一步编辑此内容以获得特定用例所需的内容,但希望这有助于解释您在输出字符串中包含

_
以及开头和结尾处的额外空格时遇到的主要问题输出字符串的末尾。

© www.soinside.com 2019 - 2024. All rights reserved.