我试图在VSCode中创建一个代码片段,以便快速地包含C++头保护。例如,带有文件路径的是C:\workspace\src\chrome\browser\ui\webui\settings\about_handler.h
预期代码段将生成如下所示:
#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_ABOUT_HANDLER_H_
#define CHROME_BROWSER_UI_WEBUI_SETTINGS_ABOUT_HANDLER_H_
#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_ABOUT_HANDLER_H_在VScode片段语法指南中,我尝试使用TM_FILEPATH变量,但无法找到将文件路径转换为上面的宏的解决方案。我试过了一些方法:
${TM_FILEPATH/([^a-zA-Z0-9])|([a-zA-Z0-9])/${1:+_}${2:/upcase}/g}_,我可以将文件路径生成为C__WORKSPACE_SRC_CHROME_BROWSER_UI_WEBUI_SETTINGS_ABOUT_HANDLER_H_。此正则表达式将将所有非数字和非字母字符转换为_,并将所有字母字符更改为大写。${TM_FILEPATH/.*src[\\\\\\/](.*)/${1:/upcase}/},我可以生成CHROME\BROWSER\UI\WEBUI\SETTINGS\ABOUT_HANDLER.H。这个regex从启动到src的路径中删除,因为我的当前工作区位于src文件夹中,所以我希望我的头宏与此相关。问题是,我不能将这两个转换组合起来得到我想要的宏。有什么办法让它起作用吗?
发布于 2020-12-05 12:48:58
您可以使用
"CppGuard": {
"prefix": "cppgrd",
"body": [
"#ifndef ${TM_FILEPATH/(?:^.*\\\\src\\\\)?(\\w+)(?!\\w*$)|(\\W)|(\\w+)$/${1:/upcase}${2:+_}${3:/upcase}${3:+_}/g}",
"#define ${TM_FILEPATH/(?:^.*\\\\src\\\\)?(\\w+)(?!\\w*$)|(\\W)|(\\w+)$/${1:/upcase}${2:+_}${3:/upcase}${3:+_}/g}",
"\n#endif // ${TM_FILEPATH/(?:^.*\\\\src\\\\)?(\\w+)(?!\\w*$)|(\\W)|(\\w+)$/${1:/upcase}${2:+_}${3:/upcase}${3:+_}/g}"
]
}命令是
${TM_FILEPATH/(?:^.*\\\\src\\\\)?(\\w+)(?!\\w*$)|(\\W)|(\\w+)$/${1:/upcase}${2:+_}${3:/upcase}${3:+_}/g}"

见regex演示。
详细信息
(?:^.*\\src\\)?(\w+)(?!\w*$) -从字符串开始(^.*)到\src\子字符串(\\src\\),到第1组((\w+))捕获的一个或多个单词字符尽可能多地出现除行中断字符以外的任何零或多个字符,而不跟随结束字符串((?!\w*$))。| -或(\W) -第2组:任何非单词字符| -或(\w+)$ -第3组:字符串末尾的一个或多个单词字符。替代办法是:
${1:/upcase} -插入组1值改为大写${2:+_} -如果第2组匹配,则插入一个_${3:/upcase} -在大写中插入第3组值${3:+_} -如果第3组匹配,则插入_。发布于 2020-12-05 18:09:28
试试这个:
"cppHeaderGuard": {
"prefix": "g1",
"body": [
"#ifndef ${TM_FILEPATH/(?:^.*\\\\src\\\\)?(\\w+)\\W?/${1:/upcase}_/g}",
"#define ${TM_FILEPATH/(?:^.*\\\\src\\\\)?(\\w+)\\W?/${1:/upcase}_/g}",
"",
"#endif // ${TM_FILEPATH/(?:^.*\\\\src\\\\)?(\\w+)\\W?/${1:/upcase}_/g}"
]
}

诀窍是,如果可能的话,将您感兴趣的所有内容,路径分隔符和最终.之间的文本放入一个捕获组。在您的情况下,使用非捕获组和未捕获的最后一位非常容易:
(?:^.*\\\\src\\\\)?(\\w+)\\W?
但是,您确实需要所有匹配的,这样vscode的代码段引擎就可以替换它。在这种情况下,替换非常简单:
${1:/upcase}_
每个完全匹配,如chrome\,将被捕获组1所取代,例如,chrome、大写和下划线。
因为您实际上希望在结尾处有一个下划线,所以这也很容易--您不需要任何条件逻辑来确定在末尾是否有一个不应该后面跟着下划线的捕获组。
https://stackoverflow.com/questions/65156083
复制相似问题