如何提取TM_FILENAME_BASE的部分?编写仓库接口代码片段需求咨询
解决方法:从文件名自动提取实体名生成仓库接口
嘿,我之前刚好折腾过类似的代码片段配置,完全能实现你想要的效果!核心就是对TM_FILENAME_BASE变量做正则替换,把IFooRepository里的Foo提取出来,然后在模板里复用。下面分常用编辑器给你具体讲:
VS Code 代码片段配置
VS Code的代码片段是JSON格式,你可以通过文件 > 首选项 > 用户代码片段创建全局或工作区的代码片段文件。这里是一个现成的可直接用的模板:
{ "Repository Interface Template": { "prefix": "repo-interface", "body": [ "public interface ${TM_FILENAME_BASE} {", " /**", " * 保存${TM_FILENAME_BASE/(^I)(.*)(Repository$)/$2/}实体", " */", " void save(${TM_FILENAME_BASE/(^I)(.*)(Repository$)/$2/} entity);", "", " /**", " * 根据ID查询${TM_FILENAME_BASE/(^I)(.*)(Repository$)/$2/}", " */", " ${TM_FILENAME_BASE/(^I)(.*)(Repository$)/$2/} findById(Long id);", "", " /**", " * 查询所有${TM_FILENAME_BASE/(^I)(.*)(Repository$)/$2/}实体", " */", " List<${TM_FILENAME_BASE/(^I)(.*)(Repository$)/$2/}> findAll();", "", " /**", " * 根据ID删除${TM_FILENAME_BASE/(^I)(.*)(Repository$)/$2/}", " */", " void delete(Long id);", "}" ], "description": "快速生成符合I[Entity]Repository命名规范的仓库接口" } }
正则替换说明
这里的关键是${TM_FILENAME_BASE/(^I)(.*)(Repository$)/$2/}:
(^I):匹配文件名开头的大写I(.*):捕获中间的实体名(比如Foo),这是我们要复用的核心部分(Repository$):匹配文件名结尾的Repository$2:用第二个捕获组(也就是中间的实体名)替换整个变量值
Sublime Text 代码片段配置
如果用Sublime Text,原理完全一样,只是语法稍有不同。创建一个.sublime-snippet文件,内容如下:
<snippet> <content><![CDATA[ public interface ${TM_FILENAME_BASE} { /** * 保存${TM_FILENAME_BASE/^I(.*)Repository$/$1/}实体 */ void save(${TM_FILENAME_BASE/^I(.*)Repository$/$1/} entity); /** * 根据ID查询${TM_FILENAME_BASE/^I(.*)Repository$/$1/} */ ${TM_FILENAME_BASE/^I(.*)Repository$/$1/} findById(Long id); /** * 查询所有${TM_FILENAME_BASE/^I(.*)Repository$/$1/}实体 */ List<${TM_FILENAME_BASE/^I(.*)Repository$/$1/}> findAll(); /** * 根据ID删除${TM_FILENAME_BASE/^I(.*)Repository$/$1/} */ void delete(Long id); } ]]></content> <tabTrigger>repo-interface</tabTrigger> <scope>source.java</scope> <description>Generate repository interface from filename</description> </snippet>
灵活调整正则适配不同命名规则
如果你的文件名规则有变化(比如不带开头的I,是FooRepository这种格式),只需要修改正则:
- 改成
${TM_FILENAME_BASE/(.*)Repository$/$1/}就能精准提取出Foo
只要文件名严格遵循固定的命名规范,这个方法就能自动把实体名填充到模板的各个位置啦!
内容的提问来源于stack exchange,提问作者James Chadwick
相关产品推荐
相关产品推荐

