vscode snippets C语言头文件宏定义

"head": {
	"prefix": "head",
	"body": [
		"#ifndef ${TM_FILENAME_BASE/([A-Za-z0-9]+)([^A-Za-z0-9]*)/${1:/upcase}${2:+_}/g}_H",
		"#define ${TM_FILENAME_BASE/([A-Za-z0-9]+)([^A-Za-z0-9]*)/${1:/upcase}${2:+_}/g}_H",
		"",
		"$0",
		"",
		"#endif // ${TM_FILENAME_BASE/([A-Za-z0-9]+)([^A-Za-z0-9]*)/${1:/upcase}${2:+_}/g}_H"
	],
	"scope": "cpp"
}

scope指定为c++
xixili-head.h为例

${TM_FILENAME_BASE/([A-Za-z0-9]+)([^A-Za-z0-9]*)/${1:/upcase}${2:+_}/g}_H

其中TM_FILENAME_BASE表示当前文件的文件名(不包含后缀名),例子为xixili-head
该表达式使用官网文档中的format语法,大致可以理解为

${源字符串/正则处理/替换规则/模式}
源字符串 TM_FILENAME_BASE即xixili-head
正则处理 ([A-Za-z0-9]+)([^A-Za-z0-9]*)
替换规则 ${1:/upcase}${2:+_}
模式 g

([A-Za-z0-9]+)([^A-Za-z0-9]*)
表示选取字母段然后选取之后的非字母段(非字母段可以没有),对于xixili-head则匹配到两次,第一次xixil- 和第二次head

${1:/upcase}${2:+_}
第一次xixili-([A-Za-z0-9]+) 段匹配到 xixili([^A-Za-z0-9]*) 段匹配到-,根据替换规则xixili将被转为XIXILI- 将转为 _

第二次的head([A-Za-z0-9]+) 段匹配到 head([^A-Za-z0-9]*) 段匹配为空,根据替换规则head将被转为HEAD

${1} 表示匹配的第一个group,加上 :/upcase 则将这个group转为大写,${2} 表示匹配的第二个group,:+ 则表示若存在(个人理解) 匹配则将group变为 _

g

表示全局匹配,即多次匹配,不会因为匹配到了 xixili- 就不再匹配了

最终结果

  • xixili-head.h -> XIXILI_HEAD_H
  • xixili.head.h -> XIXILI_HEAD_H
  • a-b-c-d-e.h -> A_B_C_D_E_H

你可能感兴趣的:(vscode,c语言)