【问题标题】:Tool is delaying output in eclipse plugin developemnt工具在 Eclipse 插件开发中延迟输出
【发布时间】:2026-02-03 07:40:01
【问题描述】:

我正在为 Eclipse 开发插件。它将运行我的 clang 工具。在 clang 工具中,我正在编写简单的 pass 来检查每个 case 和 default 语句是否必须有 break 语句。

我正在使用进程构建器运行我的 clang 工具。 我正在使用作业 API 来运行我的工具并使用 Display 类来打印错误。

当我运行我的插件时,我遇到了一些问题。 假设我评论了 case 或 default 语句之一的 break 语句,它应该在控制台中打印错误,即每个 case 和 default 语句都必须具有 break 语句。 在我输入其他内容或一些空格或在我的评论后尝试取消评论后打印错误。 同样,当我取消注释时,它不应该打印错误,但它正在打印,但是当我再次输入某些内容或一些空格或尝试评论时,错误消失了。

以下是我的代码链接

https://github.com/sunilsarode/eclipse_plugin/blob/master/ccchecker/src/ccchecker/handlers/SampleHandler.java

下图显示了我正在开发插件的 Eclipse 控制台上的第一种情况未打印错误。 这显示了我正在开发插件的 Eclipse 控制台上的第二种情况打印错误。

有什么帮助吗?

编辑: 我希望我的插件在控制台视图上输出一些东西(而不是在开发控制台上)或在文本编辑器的排水沟上输出一些点类型的东西,当我单击或悬停在那个点上时,我想显示一些带有错误消息的弹出窗口.

我尝试通过使用此链接 https://wiki.eclipse.org/FAQ_How_do_I_write_to_the_console_from_a_plug-in%3F 创建控制台来在控制台视图上打印消息 它有效,但新问题是,我失去了从文本编辑器到我创建的控制台的焦点,因此我无法测试我提到的问题。

对不起,我期待太多。

下图显示文本编辑器失去了对控制台视图的关注,并且您提到的按钮在控制台视图中不存在,但在我正在编写代码的 Eclipse 控制台中存在。

【问题讨论】:

  • 问题可能是使用StringBuilder here,因为它是"with no guarantee of synchronization"。使用StringStringBuffer 是否有效?
  • 使用 String 或 StringBuffer 是否有效? - -> 没有
  • 然后使用调试器。是否所有行都读取here?如果是,他们在哪里迷路了?
  • @howlger 不,他们没有迷路(使用字符串 StringBuffer),还有一件事我的开发控制台不同,并且运行插件的 Eclipse 控制台也不同。
  • 你想让你的插件在 Console 视图中输出一些东西还是你想要做什么?

标签: java eclipse eclipse-plugin eclipse-rcp jobs


【解决方案1】:

当我按下 Ctrl+s 时,以下 keypress 方法和 addKeyListener 不起作用。为了获得保存事件,我们必须使用 ICommandService 和保存命令。

((StyledText) editor.getAdapter(Control.class)).addKeyListener(new KeyListener() {

            @Override
            public void keyPressed(KeyEvent keyEvent) {

                if (((keyEvent.stateMask & SWT.CTRL) == SWT.CTRL) && (keyEvent.keyCode == 's')) {
                    // System.out.println("From Display I am the Key down !!" + keyEvent.keyCode);
                    Job job = new Job("My job") {

                        @Override
                        protected IStatus run(IProgressMonitor arg0) {
                            // TODO Auto-generated method stub
                            StringBuilder builder = runCCChecker(path);

                            syncWithUi(builder);
                            return Status.OK_STATUS;
                        }

                    };

                    job.setUser(true);
                    job.schedule();

                }

            }

            @Override
            public void keyReleased(KeyEvent arg0) {

            }
        });

为了在每一行显示警告,我正在使用 IMarker 界面。 为了仅在我正在触发保存命令的 Eclipse 编辑器的当前活动文件上运行我的工具,我正在使用 IPartService 服务。

以下是我的代码链接

https://github.com/sunilsarode/eclipse_plugin/blob/master/ccchecker/src/ccchecker/handlers/SampleHandler.java

它工作正常。如果有人发现任何问题,请告诉我。

【讨论】: