Groovy IntelliJ "尖括号 (<>)" 修改代码样式设置

10

我目前在使用IntelliJ的"Reformat Code"功能时遇到了代码样式设置的问题。

必要信息:

我正在编写使用一些Java功能(例如泛型)的Groovy脚本。

似乎我的Groovy版本(由于各种原因无法更改)在定义变量时会出现编译问题,例如:

不可用:

final List<Map<String, Object>> listOfMaps = a["b"] as List<Map<String, Object>>
问题在于,如果在最后两个封闭的尖括号之间没有空格,则编译器只能正确解释它们中的最后两个。 < p > 工作中:

final List<Map<String, Object>> listOfMaps = a["b"] as List<Map<String, Object> >

我使用的groovy版本中有一个已知的bug。

问题:

"重新格式化代码"功能总是会删除我在脚本中添加的尖括号结束标签之间所加的空格,而这些空格是为了使脚本编译通过。

问题:

如何让IntelliJ不要删除这些空格?

尝试过的解决方案:

这个设置对于Java文件是存在的(设置->编辑器->代码风格->JAVA->空格->在尖括号内)。

导出的XML设置:

<JavaCodeStyleSettings>
<option name="SPACES_WITHIN_ANGLE_BRACKETS" value="true" />

但对于Groovy来说不管用,所以我尝试像这样为Groovy添加它:

<codeStyleSettings language="Groovy">
<option name="SPACES_WITHIN_ANGLE_BRACKETS" value="true" />

重新格式化时,只会冻结一分钟左右,然后再次删除空格。

可能是因为Groovy不知道这些尖括号,因此这里使用了Java功能。


似乎不可能。请随意在YouTrack上创建功能请求:http://youtrack.jetbrains.com/issues/IDEA。 - y.bedrov
你可以尝试添加一个 SPACE_WITHIN_GSTRING_INJECTION_BRACES 然后看看是否有帮助?该值将为 true。 - Tarun Lalwani
@TarunLalwani 我这样添加的: <GroovyCodeStyleSettings> <option name="SPACE_WITHIN_GSTRING_INJECTION_BRACES" value="true" /> </GroovyCodeStyleSettings> 没有起作用... - CodeFanatic
根据其他答案,现在还没有办法做到这点。一个潜在的解决方法是录制一个宏,首先格式化代码然后将所有 ">>" 替换为 "> >"。但如果你使用右移运算符,则会出现问题。你可以尝试使用正则表达式,但无法在宏中强制执行该操作。 - Daniel
从技术上讲,根据这个链接:http://www.jetbrains.org/intellij/sdk/docs/tutorials/custom_language_support_tutorial.html,添加自定义语言(也许可以基于Groovy?)是可能的,但这是一个相当重要的任务。 - Daniel
2个回答

3
我已经检查了反编译的源代码,似乎不支持在 Groovy 中使用 SPACES_WITHIN_ANGLE_BRACKETS。每个格式化程序都有单独的格式化规则和配置。现有的任何配置都无法帮助你完成任务。

Only for Java

No Option in Groovy

正如 @ybedrov 提到的那样,您需要向 them 提出增强请求

没有现有的选项可以帮助您

正如 @daniel 指出的那样,确实存在一种方法,即创建自己的自定义语言

http://www.jetbrains.org/intellij/sdk/docs/tutorials/custom_language_support_tutorial.html

但是,如果你只关注单个空格的话,那个选项只存在于童话世界中。我会运行一个Bash脚本,使用sed命令来解决这个问题。

$ find . -name "*.groovy" | xargs sed 's|>>|> >|g' -i

有没有一种方法可以增强现有的配置? - CodeFanatic
不,这是一个闭源项目,所以除了请求他们将其作为功能请求之外,您无法做任何事情。 - Tarun Lalwani
自定义语言支持 已经 包括在内,但这不是一个“半小时内自己动手完成”的项目。文档可以在这里找到:http://www.jetbrains.org/intellij/sdk/docs/tutorials/custom_language_support_tutorial.html - Daniel
这会是为了一个缺失的空格而付出很大的努力 :-) - Tarun Lalwani

0

也许你可以在有问题的地方添加注释,以防格式化程序破坏代码。例如:

final List<Map<String, Object>> listOfMaps = a["b"] as List<Map<String, Object>/**/>

假设这个能运行,至少比破损的代码好,尽管相当丑陋。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接