首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现用于VSCode头保护的C++片段

实现用于VSCode头保护的C++片段
EN

Stack Overflow用户
提问于 2020-12-05 10:44:57
回答 2查看 3K关注 0票数 2

我试图在VSCode中创建一个代码片段,以便快速地包含C++头保护。例如,带有文件路径的是C:\workspace\src\chrome\browser\ui\webui\settings\about_handler.h

预期代码段将生成如下所示:

代码语言:javascript
复制
#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文件夹中,所以我希望我的头宏与此相关。

问题是,我不能将这两个转换组合起来得到我想要的宏。有什么办法让它起作用吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-05 12:48:58

您可以使用

代码语言:javascript
复制
"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}"
        ]
      }

命令是

代码语言:javascript
复制
${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组匹配,则插入_
票数 5
EN

Stack Overflow用户

发布于 2020-12-05 18:09:28

试试这个:

代码语言:javascript
复制
"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、大写和下划线。

因为您实际上希望在结尾处有一个下划线,所以这也很容易--您不需要任何条件逻辑来确定在末尾是否有一个不应该后面跟着下划线的捕获组。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65156083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档