有没有一种方法可以将多个变量声明转换为每行一个?

13

在Eclipse中,是否有自动转换以下代码的方法:

int myX, myY, myZ;

...至此...

int myX;
int myY;
int myZ;

我以为可以通过“清理”和“成员排序”偏好设置来完成这个操作,但它并没有将多个声明分解成每行一个。有没有办法实现呢?

编辑:澄清一下,这是关于成员变量的。


@IraBaxter 我最感兴趣的是通过Eclipse实现的方法,但如果只能通过其他集成开发环境来实现,我也想听听。 - martinez314
你需要做多少次?即你要对多少个变量进行此操作? - Noob
你使用这个工具的目的是什么?(即为什么要将变量声明放在单独的行中?) - Ryan Dougherty
@Ryan 一行一个符合Java规范(请参见下面的答案,指出Checkstyle将标记多个声明)。它被认为具有较少的混淆潜力。 - martinez314
@Noob 数千个类文件中的数百个。 - martinez314
显示剩余3条评论
5个回答

7

虽然我不知道有没有一种函数可以做到这一点,但您可以通过几个按键来获得类似的结果:

  1. 高亮显示包含多个变量定义的行,并使用查找/替换功能(按键:Ctrl-F)将逗号空格序列替换为分号、空格和变量类型。请确保范围设置为“所选行”,如下图所示:

    Find replace dialog

  2. 现在,你仍然有一行包含所有变量声明的行。这可以通过突出显示相同的行和源代码 > 格式化功能(按键:Shift-Ctrl-F)来修复。

    Source format menu

  3. 完成了,现在您有了各自类型的变量,每个变量占一行:

    All done


2
这种方法在处理大型文件时毫无用处。 - Chase
1
我会将查找和替换步骤设置为正则表达式,以查找逗号加可选空格。 - Sean Reilly
1
我认为@E-Riz的答案最终会是最好的解决方案,但这个方法作为一个快速、简单的修复措施也很有效。谢谢。 - martinez314
@whiskeyspider:我认为你会发现,对于“数千个跨越数百个类文件”的情况,使用这种方法相当困难 :) - skarist
@skarist 这不是一个可以自动适用于所有类的解决方案,而是逐个类地进行 -- 由于我已经准备好了格式化程序 -- 它确实节省了时间。 - martinez314

6
没有内置的清理或格式化选项来实现这一点(这让我感到惊讶)。然而,编写一个插件来完成这个任务并不是非常困难。参考这个扩展点。类org.eclipse.jdt.internal.ui.fix.VariableDeclarationCleanUp看起来像是一个潜在的例子和指南。

3
Eclipse并未原生提供此格式功能。您可以使用"Checkstyle"插件来检查此项以及许多其他编码标准。在"Checkstyle"配置文件中,使用模块MultipleVariableDeclarations,如下所示:
<module name="Checker">
    <module name="TreeWalker">
        <property name="cacheFile" value="target/cachefile"/>
        <property name="tabWidth" value="4"/>
        ...
        <module name="MultipleVariableDeclarations"/>
        ...
    </module>
</module>

如果您习惯使用命令行工具,那么astyleGC GreatCode是两个不错的代码格式化工具。 GC GreatCode被认为是C/C++代码格式化工具,但在这种情况下,它也可以很好地格式化您的代码。
GC中,拆分变量声明的选项是-code_split_decl_style 原始代码:
String fileName, a, b, c;

使用-code_split_decl_style-1选项:

String  fileName,
        a,
        b,
        c;

使用 -code_split_decl_style-2 选项:

String fileName;
String a;
String b;
String c;

您可以使用UniversalIndentGUI在一个图形化界面工具中尝试不同的命令行格式化工具和配置来处理各种语言。
Checkstyle: http://checkstyle.sourceforge.net/ Astyle: astyle.sourceforge.net/
GC GreateCode: http://sourceforge.net/projects/gcgreatcode/ UniversalIndentGUI: universalindent.sourceforge.net/

2
“Eclipse似乎没有提供这个功能,我也没找到一个可以做到的插件。但是假设你有awk,你可能会发现这个小awk脚本很有用:”
{
  if (match($0,/([a-z|A-Z|0-9|_]+)\s+(([a-z|A-Z|0-9|_]+)\s*,\s*)+([a-z|A-Z|0-9|_]+);/)) {
    match($0,/(\s*[a-z|A-Z|0-9|_]+)\s+([^;]*)/,components);
    split(components[2],vars,",");
    for(i in vars) {
      gsub (/'[[:cntrl:]]|[[:space:]]|\x20/,"",vars[i])
      print components[1],vars[i]";"
    }
  }
  else {
   print $0;
  }
}

它将完成所需的工作。假设您将其保存到名为 script.awk 的文件中,则可以像这样调用它。
awk -f script.awk target_file.java

注意:您必须将输出定向到另一个文件,否则您的源文件将被覆盖(清空)。
因此,如果您想一次处理多个文件,应该像这样做(假设使用 bash shell):
for f in *.java; do awk -f awk1.awk $f > $f.pr; done

对于每个java文件,这将创建一个以.java.pr结尾的新文件,然后您只需将它们移动到以.java结尾的文件中。
================== 编辑 =================
只想补充说明一下,Eclipse存在支持在选定区域上运行bash/awk脚本的插件。请参见以下链接: http://eclipseexeditor.sourceforge.net/ (可能过时了)
还有这里: Bash script plugin for Eclipse?.
因此,我的脚本与其中一个插件结合使用,应该可以为Eclipse添加所请求的功能。

0

据我所知,Eclipse没有这样的现成功能。

我假设你是一名Java程序员,因此你最好编写一个简单的程序来解析出这种模式的源代码,并将其转换为所需的多行格式。然后在其上运行清理操作,以使其按照要求正确格式化。


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