【问题标题】:Is there a way to convert multiple variable declarations to one per line?有没有办法将多个变量声明转换为每行一个?
【发布时间】:2014-04-17 02:14:01
【问题描述】:

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

int myX, myY, myZ;

...到这个...

int myX;
int myY;
int myZ;

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

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

【问题讨论】:

  • 我不认为 format 会为你做这件事,但你也许可以创建一个格式化规则(你可以这样做吗?)
  • 你坚持使用 Eclipse 答案吗?
  • @IraBaxter 我最感兴趣的是通过 Eclipse 实现它的方法,但如果另一个 IDE 是唯一的方法,我仍然想听听。
  • 您需要这样做多少次?即,您要对多少变量执行此操作?
  • 拥有一个工具来完成这个任务的目的是什么? (即为什么要在不同的行上声明变量?)

标签: java eclipse code-formatting


【解决方案1】:

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

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

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

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

【讨论】:

  • 这种方法在任何比最微不足道的文件更大的文件中都没有用。
  • 我会将查找和替换步骤设为查找逗号和可选空格的正则表达式。
  • 我认为@E-Riz 的回答最终会是最好的解决方案,但这对于这个问题来说是一个快速、简单的解决方案。谢谢。
  • @whiskeyspider:我认为您会发现很难将这种方法用于“数千个类文件中的数千个”。 :)
  • @skarist 这不是一个可以在所有类中自动运行的解决方案,而是在逐个类的基础上——因为我已经准备好了一个格式化程序——它确实节省了时间。
【解决方案2】:

没有内置的 Clean Up 或 Formatter 选项可以做到这一点(这让我感到惊讶)。但是,编写一个插件来做到这一点并不难。作为参考,您可以从this extension point 开始。 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 在一个 GUI 工具中使用不同的命令行格式化工具和各种语言的配置。


    检查样式:http://checkstyle.sourceforge.net/

    Astyle:astyle.sourceforge.net/

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

    UniversalIndentGUI:universalindent.sourceforge.net/

    【讨论】:

      【解决方案4】:

      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。

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-14
          • 2018-10-23
          • 2015-07-19
          • 2017-12-18
          相关资源
          最近更新 更多