【问题标题】:How to get Eclipse Console to hyperlink text to source code files?如何让 Eclipse 控制台将文本超链接到源代码文件?
【发布时间】:2011-09-22 02:29:37
【问题描述】:

在代码中: System.out.println("myPackage.MyClass");

在 Eclipse 控制台中: myPackage.MyClass.myMethod

我想点击控制台中的输出(myPackage.MyClass.myMethod),它直接显示相应的方法,类似于异常堆栈跟踪发生的情况。有什么想法吗?

【问题讨论】:

    标签: eclipse hyperlink console


    【解决方案1】:

    也许这对其他人来说很清楚,但我发现其他答案令人困惑,尽管是正确的。 Eclipse 控制台将模式 (FileName.java:lineNumber) 解析为指向该文件中该行的链接:

    (MyFile.java:2)
    

    正如其他答案所指出的,有很多方法可以将其输出到控制台。行中的位置无关紧要,它只是一个模式匹配。正如 Colin Smith 所示,log4j PatternLayout 可以使用(%F:%L) 来获取文件名和行号。要以编程方式获取文件名和行号,请​​参阅this question

    该问题询问有关链接到方法的问题,我相信您可以使用 Tonny Madsen 推荐的 consolePatternMatchListeners 方法,并在this question 中进行了更详细的描述。

    【讨论】:

      【解决方案2】:

      异常堆栈跟踪的超链接基于行尾给出的文件名和行号。例如

      Stack trace:
      
      org.eclipse.jface.internal.databinding.provisional.BindingException: string property does not have a read method.
      at org.eclipse.jface.internal.databinding.internal.beans.JavaBeanObservableValue.doGetValue(JavaBeanObservableValue.java:102)
      at org.eclipse.jface.internal.databinding.internal.beans.JavaBeanObservableValue.setValue(JavaBeanObservableValue.java:83)
      

      对于第一个堆栈跟踪,它位于文件 JavaBeanObservableValue.java 的第 102 行。在当前类路径中搜索该文件,因此如果您有多个具有相同名称的类,则始终会找到第一个...

      换句话说,如果你想根据你的例子添加扩展超链接,你需要扩展控制台视图一点......

      ...这可以通过org.eclipse.ui.console.consolePatternMatchListeners 扩展点来完成。使用这个扩展点非常容易,通过查看 JDT 中的示例,您应该能够让您的示例在没有太多工作的情况下工作......

      【讨论】:

        【解决方案3】:

        一个更简单的方法是欺骗控制台为您创建一个链接。格式很简单:

        System.out.println("(" + new TestBed().getClass().getSimpleName() + ".java:" + 18 + ")");
        

        显然您可以根据需要在代码中提供类类型和行号。

        【讨论】:

        • 要获取当前行的行号,可以抛出异常并从中获取行号。可能效率不高,但如果您正在做这种事情,那么效率可能不是您所追求的。
        • Class.getName 将输出规范的类名 - 带有包,因此这仅在您不使用包时才有效(这是错误代码的指标),getSimpleName 应该适用于所有情况
        【解决方案4】:

        或者,如果你使用 log4j,你可以像这样配置你的 appender:

        <appender name="console" class="org.apache.log4j.ConsoleAppender">
            <param name="Target" value="System.out"/>
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%d{HH:mm:ss,SSS} %-5p %m (%F:%L) in %t%n"/>
            </layout>
        </appender>
        

        如果您也希望它在 IntelliJ IDEA 中工作,您可以使用:

                <param name="ConversionPattern" value="%d{HH:mm:ss,SSS} %-5p %m - at %c.%M(%F:%L) in %t%n"/>
        

        【讨论】:

          【解决方案5】:

          我使用自定义控制台视图并将 IPatternMatchListener 添加到 MessageConsole

          console.addPatternMatchListener(...)
          

          使用监听器的一个重要优点是事件提供了创建超链接所需的偏移量

          可以在此处找到实现创建超链接的 IPatternMatchListener 的起点:

          https://github.com/mjwach/ErrorLinkyThing/blob/master/source/errorlinkything/ErrorLinkyPatternMatchListenerDelegate.java

          最棘手的部分似乎是从文件名中获取完整的文件路径(我不使用记录器)。

          可以在此处找到遮阳插件使用的解决方法:

          http://sunshade.cvs.sourceforge.net/viewvc/sunshade/net.sourceforge.sunshade/src/net/sourceforge/sunshade/util/FileUtil.java?view=markup

          参见方法“dereferenceWindowsLink”

          我仍在寻找替代方案。

          【讨论】:

            【解决方案6】:

            这是一个基于其他人的答案的简单包装方法,可用于任何地方获取格式化的字符串,以便 Eclipse 控制台链接到 getSourceCodeLine() 的任何文件中的行 被调用。我还发现在 Eclipse 中打印到 System.err 将显示为 red

            public static String getSourceCodeLine() {
                // An index of 1 references the calling method
                StackTraceElement ste = new Throwable().getStackTrace()[1]; 
                return "(" + ste.getFileName() + ":" + ste.getLineNumber() + ")";
            }
            
            public static void main( String[] args )
                System.out.println("Here's a link to " + getSourceCodeLine());
                System.err.println("And a red link to " + getSourceCodeLine());
            }
            

            【讨论】:

              【解决方案7】:

              要添加到其他答案,您可以使用这种古怪的格式链接到特定的课程:

              java.util..(List.java:100)
              java.awt..(List.java:100)

              【讨论】:

                猜你喜欢
                • 2017-07-16
                • 2015-11-05
                • 2017-03-18
                • 1970-01-01
                • 2021-04-27
                • 2010-10-10
                • 1970-01-01
                • 1970-01-01
                • 2020-09-19
                相关资源
                最近更新 更多