当前位置: 首页 > news >正文

Eclipse 插件开发 5.3 编辑器 监听输入

Eclipse 插件开发 5.3 编辑器监 听输入

  • 1 插件配置
  • 2 添加监听
  • 3 查看效果

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Click1
Bundle-SymbolicName: com.xu.click1;singleton:=true
Bundle-Version: 1.0.0
Bundle-Activator: com.xu.click1.Activator
Bundle-Vendor: XU
Require-Bundle: org.eclipse.ui,org.eclipse.core.runtime,org.eclipse.ui.editors,org.eclipse.ui.workbench.texteditor,org.eclipse.core.resources,org.eclipse.text
Bundle-RequiredExecutionEnvironment: JavaSE-24
Automatic-Module-Name: com.xu.click1
Bundle-ActivationPolicy: lazy

org.eclipse.ui.IStartup 是 Eclipse 插件开发中用于在 工作台启动时自动执行代码 的接口。
org.eclipse.ui.IStartup 适用于以下场景:
1、启动时注册监听器(如监听编辑器、视图、资源等)
2、启动时预加载某些资源或服务
3、提前初始化你的插件逻辑
4、注册全局快捷键、UI 元素等

IStartup 注意事项

注意点说明
UI 操作必须放在 UI 线程中使用 Display.getDefault().asyncExec(...)
插件必须在 plugin.xml 中注册扩展点否则 earlyStartup() 不会执行
不要阻塞 earlyStartup()否则会影响 Eclipse 启动速度

IStartup 常见用途示例

用途说明
自动附加文档监听器监听所有打开的 ITextEditor 并获取实时输入
注册资源监听器监听项目、文件变化
注册窗口、视图、编辑器监听器管理 UI 生命周期
初始化日志系统、缓存等提前准备插件运行环境

1 插件配置

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin><extension point="org.eclipse.ui.startup"><startup class="com.xu.click1.StartupListener" /></extension></plugin>

2 添加监听

package com.xu.click1;import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IStartup;import com.xu.edit.EditUtil;public class StartupListener implements IStartup {@Overridepublic void earlyStartup() {Display.getDefault().asyncExec(() -> {new EditUtil().addEditListener();});}}
package com.xu.edit;import org.eclipse.jface.text.DocumentEvent;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentListener;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IPartListener2;
import org.eclipse.ui.IPartService;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.texteditor.ITextEditor;public class EditUtil {public void addEditListener() {IWorkbench workbench = PlatformUI.getWorkbench();oldEditListener(workbench);newEditListener(workbench);}private void oldEditListener(IWorkbench workbench) {if (null == workbench) {return;}IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();if (null == window) {return;}IWorkbenchPage page = window.getActivePage();if (null == page) {return;}for (IEditorReference ref : page.getEditorReferences()) {IEditorPart editor = ref.getEditor(true);if (null == editor) {continue;}addListener((ITextEditor) editor);}}private void addListener(ITextEditor editor) {if (null == editor) {return;}IDocumentProvider provider = editor.getDocumentProvider();IDocument document = provider.getDocument(editor.getEditorInput());document.addDocumentListener(new IDocumentListener() {@Overridepublic void documentAboutToBeChanged(DocumentEvent arg0) {// TODO Auto-generated method stub}@Overridepublic void documentChanged(DocumentEvent arg0) {// TODO Auto-generated method stubSystem.out.println(String.format("%s:%s", arg0.getOffset(), arg0.getText()));}});}private void newEditListener(IWorkbench workbench) {if (null == workbench) {return;}for (IWorkbenchWindow window : workbench.getWorkbenchWindows()) {if (window == null) {continue;}IPartService service = window.getPartService();if (null == service) {continue;}service.addPartListener(new IPartListener2() {@Overridepublic void partOpened(IWorkbenchPartReference partRef) {IWorkbenchPart part = partRef.getPart(false);if (part instanceof ITextEditor) {addListener((ITextEditor) part);}}});}}}

3 查看效果

在这里插入图片描述

相关文章:

  • React Context 与状态管理:用与不用
  • 【数据分析】特征工程-特征选择
  • JS语言基础
  • 【华为战报】4月、5月 HCIP考试战报!
  • 将 AI 解答转换为 Word 文档
  • 题目 3314: 蓝桥杯2025年第十六届省赛真题-魔法科考试
  • 一篇学习CSS的笔记
  • 【深度学习】10. 深度推理(含链式法则详解)RNN, LSTM, GRU,VQA
  • 进阶知识:Selenium底层原理深度解析
  • 如何设计高效的数据湖架构:存储策略、Schema 演进与数据生命周期管理
  • Flask集成Selenium实现网页截图
  • 使用 Selenium 进行自动化测试:入门指南
  • 物流项目第九期(MongoDB的应用之作业范围)
  • 【unity游戏开发——编辑器扩展】EditorUtility编辑器工具类实现如文件操作、进度条、弹窗等操作
  • STM32学习笔记---时钟树
  • 《基于AIGC的智能化多栈开发新模式》研究报告重磅发布! ——AI重塑软件工程,多栈开发引领未来
  • PHP+MySQL开发语言 在线下单订水送水小程序源码及搭建指南
  • Kruskal算法剖析与py/cpp/Java语言实现
  • python 小工具,获取 github 仓库信息
  • openFuyao开源发布,建设多样化算力集群开源软件生态
  • wordpress主题超2m/seo引擎搜索网站
  • 网站开发如何避免浏览器缓存的影响/一份完整的营销策划书
  • 如何建立网站快捷方式到桌面/seo做什么网站赚钱
  • 郑州大型网站/企业网站模板 免费
  • 马鞍山做网站公司/百度推广点击收费标准
  • 凤阳做网站/交换友情链接的网站标准是什么