IDEA 2026.2 EAP 2 新特性:Live Templates 升级
昨天下午,我试图用IDEA的Live Templates写一个批量生成DTO的方法。模板缩写是gendto,预期效果是输入字段列表,自动展开成一堆getter/setter。
结果:卡住了。
因为我想在模板里写"对每个字段执行同样的操作",但IDEA的模板系统摊手:“抱歉,foreach循环?我们还不支持在变量补全里这么玩。”
那一刻,我对着屏幕叹了口气。这感觉就像:你有一把瑞士军刀,但发现它居然不能开红酒瓶——明明只差一个小零件。
一个"小众"但"刚需"的功能
最近,IDEA 2026.2 EAP 2 发布了foreach的自动补全
让我给你讲个真实场景:
假设你要写一个Spring Boot的Controller,里面有10个API端点,每个端点的结构都差不多:
@GetMapping("/user")fungetUser()=...@GetMapping("/order")fungetOrder()=...@GetMapping("/product")fungetProduct()=...// ... 还有7个理想中的Live Templates体验应该是:
- 输入
genctrl - 粘贴端点列表:
user,order,product,... - IDEA自动展开成10个方法
但现在的现实是:你要么手动写10次,要么写一个更复杂的模板,但没法在变量补全阶段用foreach迭代。
技术拆解:Live Templates的"变量魔法"是怎么玩的?
在深入foreach之前,先快速科普一下IDEA Live Templates的核心机制:
三层架构理解模板系统
┌─────────────────────────┐ │ 用户输入: "for" + Tab │ └──────────┬──────────────┘ │ 触发 ┌──────────▼──────────────┐ │ 模板引擎解析 │ │ - 固定文本 → 直接插入 │ │ - 变量$VAR$ → 计算/询问 │ │ - 宏函数 → 执行逻辑 │ └──────────┬──────────────┘ │ 生成 ┌──────────▼──────────────┐ │ 最终代码 │ │ for (String item : items) { } │ └─────────────────────────┘变量的"修饰符"系统:mod-completion是什么?
这是很多用户(包括我)容易忽略的高级功能。
在Live Templates里,变量可以带"修饰符"来控制它的行为[[4]]:
| 修饰符 | 作用 | 示例 |
|---|---|---|
default | 默认值 | $VAR$ |
hint | 输入时显示提示 | $VAR$with hint |
completion | 启用代码补全 | $VAR$with completion |
mod-completion | 修改补全行为 | 这就是Issue的核心 |
mod-completion的"mod"是"modifier"的缩写,意思是"可以动态修改补全结果的变量"。
举个栗子🌰:
<templatename="log"value="logger.info($MSG$);"><variablename="MSG"expression="completion(mod-completion)"/></template>这里MSG变量的补全结果可以被"修改"——比如根据上下文过滤建议、格式化输出等。
那foreach想解决什么问题?
用户希望在mod-completion的表达式里能用Velocity模板语言的foreach语法。
Velocity是Apache的模板引擎,IDEA的Live Templates底层就在用它
当前限制:
## 你想写这个(但还不支持): #foreach($field in $FIELDS) $field$ #end ## 但mod-completion里只能用简单表达式: $completion(mod-completion)$如果这个功能实现了,模板能力会指数级提升:
- 批量生成CRUD方法
- 根据字段列表自动生成验证逻辑
- 动态构建注解参数
写到这里,突然想起德国哲学家海德格尔在《存在与时间》里讨论"工具"时的观点:
“上手的工具是透明的,只有当它出问题时,我们才注意到它的存在。”
翻译到开发场景:
- 当Live Templates好用时,你感觉不到它的存在,代码自然就流出来了
- 当它缺少
foreach时,你突然意识到:“啊,这里卡住了”
这个看似微小的功能请求,本质上是在追问:我们的工具,是在延伸我们的创造力,还是在用"不支持"悄悄限制我们的想法?
“技术的本质,是让人成为更完整的人,而不是让工具成为人的主人。” —— 改编自唐·伊德
写在最后
有时候,改变世界的不是惊天动地的重构,而是某个深夜,一个开发者提交的"能不能加个foreach"。
这个请求背后,是无数开发者对"更高效表达想法"的渴望。
“代码的终极目的,不是被机器执行,而是让人的思想得以延伸。”
当IDEA的模板系统学会foreach,它学会的不是一个语法特性,而是对开发者创造力的尊重。
