1

我正在尝试为 sublime text 3 制作一个片段,我想将文件名变量(TM_FILENAME)转换为大写并将“.c”替换为“_H”。我有表达方式,但不是同时。

我试图把它们放在一起,但是没有用。

我拥有的片段文件的内容:

#ifndef ${1:${TM_FILENAME/\..+$/_H/}}
# define ${1:${TM_FILENAME}}
${1/(.*)/\U$1/\E}
$0

#endif

文件名为 test.c,结果如下:

#ifndef test_H
# define test_H
TEST_H


#endif

第三行是我想要的,但我想要在 ifndef 和定义之后。
所以我需要将第三行的正则表达式与第一行结合起来。

4

1 回答 1

0

正如@keith-hall 在对您的问题的评论中提到的那样,这可以通过利用 Sublime 使用boost 正则表达式语法来匹配和提升格式字符串来创建替换文本这一事实来实现。

这暴露的功能之一是替换文本中的条件表达式的想法:

性格 '?' 开始一个条件表达式,一般形式是:

?Ntrue-expression:false-expression

其中 N 是十进制数字。

如果子表达式 N 匹配,则计算 true-expression 并将其发送到输出,否则计算 false-expression 并将其发送到输出。

这意味着对于包含在正则表达式中的每个捕获组,您可以指定应该替换为两个单独的文本项;当组捕获一些文本时替换文本,当它没有捕获一些文本时替换文本。

根据您上面的问题,一个例子是这样的:

${1:${TM_FILENAME/(\.c)|(.)/(?1_H:)(?2\u$2:)/g}}

这里的正则表达式部分是(\.c)|(.),它匹配文字文本.c(第 1 组)或任何单个字符(第 2 组)。

在替换文本中,(?1_H:)表示如果第一个捕获组捕获了任何文本,则替换它应该是文字文本_H;否则替换文本应该是一个空字符串。

接下来,(?2\u$2:)如果捕获组 2 捕获了任何内容,则替换文本应该是字符的大写版本;否则替换应该是一个空字符串。

由于输入正则表达式具有交替(|字符),因此正则表达式匹配一个或另一个;因此,在替换文本中,只有一组或另一组中有任何文本,并且输出会相应地执行。

正则表达式中的选项指定g确保正则表达式应用于所有内容;否则它只会匹配一次,在这种情况下会产生大写文件名中的第一个字符然后停止的效果。

于 2019-11-04T21:58:20.763 回答