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

问题描述 投票:0回答:5

在 Eclipse 中,是否有自动转换的方法:

int myX, myY, myZ;

...对此...

int myX;
int myY;
int myZ;

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

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

java eclipse code-formatting
5个回答
7
投票

虽然我不知道single函数是否可以做到这一点,但您可以通过几次按键获得类似的结果:

  1. 突出显示包含多个变量定义的行,然后使用查找/替换功能(按键:

    Ctrl-F
    )将逗号空格序列替换为分号、空格和变量类型。确保范围设置为“选定的行”,如以下屏幕截图所示:

    Find replace dialog

  2. 现在您仍然会在一行中包含所有变量声明。这可以通过突出显示同一行和 Source > Format 功能(按键:

    Shift-Ctrl-F
    )来修复。

    Source format menu

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

    All done


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>

如果您可以使用命令行工具,那么

astyle
GC 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/


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 来说可能比较旧)

还有这里:

Eclipse 的 Bash 脚本插件?.

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


0
投票

据我所知,Eclipse 中没有开箱即用的此类功能。

我假设您是一名 Java 程序员,因此您最好的选择是编写一个简单的程序,该程序将解析此类模式的源代码并根据需要将其转换为多行。然后在其上运行 clean up 以根据需要正确格式化。

© www.soinside.com 2019 - 2024. All rights reserved.