有没有办法将多个变量声明转换为每行一个?

时间:2014-03-12 18:02:46

标签: java eclipse code-formatting

在Eclipse中,是否有一种自动转换方式:

int myX, myY, myZ;

......对此...

int myX;
int myY;
int myZ;

我认为我可以通过'清理'和'成员排序顺序'首选项来完成此操作,但它不会将多个声明分解为每行一个。有办法吗?

编辑:为了澄清,这与成员变量有关。

5 个答案:

答案 0 :(得分:7)

虽然我不知道单个函数是否可以执行此操作,但您可以通过几次击键获得类似的结果:

  1. 突出显示包含多个变量定义的行,并使用查找/替换函数(按键:Ctrl-F)将逗号空间序列替换为分号,空间和变量的类型。确保范围设置为"选定的行"如下面的屏幕截图所示:

    Find replace dialog

  2. 现在,您仍然会在一行中包含所有变量声明的行。这可以通过突出显示相同的行和 Source>来解决。格式功能(按键:Shift-Ctrl-F)。

    Source format menu

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

    All done

答案 1 :(得分:6)

没有内置的清理或格式化程序选项(这让我感到惊讶)。但是,编写插件来完成它并不会非常困难。作为参考,您从this extension point开始。课程org.eclipse.jdt.internal.ui.fix.VariableDeclarationCleanUp看起来像是一个可以学习的例子和指南。

答案 2 :(得分:2)

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在一个GUI工具中使用不同命令行格式化工具和各种语言的配置。


Checkstyle:http://checkstyle.sourceforge.net/

Astyle:astyle.sourceforge.net /

GC GreateCode:http://sourceforge.net/projects/gcgreatcode/

UniversalIndentGUI:universalindent.sourceforge.net /

答案 3 :(得分: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/ (对于较新版本的Eclipse,可能是旧的)

还有:

Bash script plugin for Eclipse?

因此,我的脚本与其中一个插件相结合可能会将所请求的功能添加到Eclipse中。

答案 4 :(得分:0)

我知道Eclipse中没有开箱即用的功能。

我假设您是一名java程序员,因此您最好的选择是编写一个简单的程序来解析这种模式的源代码并根据需要将其转换为多行。然后在它上面运行清理,以便根据需要正确格式化。