如何在IntelliJ中正确格式化缩进Magnolia CMS的FreeMarker(.ftl)文件
在Magnolia CMS开发FreeMarker模板时,常会遇到代码缩进杂乱的情况,哪怕用IntelliJ自带的「重新格式化代码」「自动缩进行」功能,输出效果也不尽如人意——比如原代码层级混乱,格式化后还是达不到预期的规整结构。
以下是几个实用的解决办法:
1. 校准IntelliJ的FreeMarker格式化配置
打开IntelliJ的设置(File > Settings),依次进入Languages & Frameworks > Template Languages > FreeMarker,再切换到Code Style > FreeMarker标签页:
- 把「Indent」的数值设为2(和你期望的缩进一致)
- 勾选「Indent children of root elements」,确保根元素的子节点能正确缩进
- 检查「Keep line breaks in FTL directives」等相关选项,保证
#if这类FTL指令的缩进逻辑被正确识别
另外还要同步HTML的格式化规则:进入Settings > Editor > Code Style > HTML,把缩进大小也设为2,避免两种语言的格式化规则冲突。
2. 手动调整FTL指令的格式
对于内嵌在HTML属性里的FTL代码(比如<div class="[#if condition]class1[/#if]">),IntelliJ可能无法完美识别,这部分可以保留现有写法,重点调整HTML标签的层级缩进。
对于块级FTL指令(比如[#if someCondition]...[/#if]),要保证指令本身和内部HTML标签的缩进匹配层级:比如把指令开头和父容器同缩进,内部的<span>再缩进一级,就像你期望的示例那样。
3. 借助第三方插件增强格式化能力
安装IntelliJ官方的「FreeMarker Support」插件,它能强化IDE对FTL文件的语法识别和格式化支持。安装完成后重启IDE,再用快捷键Ctrl+Alt+L重新格式化代码,效果会更理想。
调整后的正确格式化代码示例:
<div class="[#if condition]class1[/#if]" id="my-id" [#if condition]data-test="true"[/#if]> <div> <div> <section class=""> <div> <div> <div> [#if someCondition] <span>Lorem Ipsum</span> [/#if] </div> <div> <span>Lorem Ipsum</span> </div> </div> </div> </section> <div id="container"> </div> </div> </div> </div> <script defer src="/something/source.js"></script>
内容的提问来源于stack exchange,提问作者Davide Buoso

