"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