如何移除Eclipse右键菜单及重构主菜单中特定资源类型的Move命令
问题诊断
你的配置存在3个核心错误:
- 错误1:
<enabledWhen>作用域不符合需求:org.eclipse.ui.activities的<enabledWhen>是工作台全局级别的启用条件,无法获取当前选中的资源上下文,你在这里配置的<instanceof>判断完全不会触发,这是配置不生效的核心原因。 - 错误2:命令ID匹配错误:你尝试的两个pattern对应的都不是工作台通用的Move命令,通用Move命令ID为
org.eclipse.ui.edit.move,部分专属资源(如Java文件)的专用Move命令ID为org.eclipse.jdt.ui.edit.text.java.move,两者都需要匹配才能覆盖所有场景。 - 错误3:activity逻辑反向:activity未激活时,其绑定的UI元素会被隐藏。你要实现选中PResource时隐藏Move命令,需要的逻辑是:选中PResource时activity禁用,其他情况激活,你的现有
<enabledWhen>逻辑本身是反向的,且因作用域问题无法生效。
解决方案
提供两种可落地的实现方式:
方案一:命令可见性控制(更推荐,无需额外代码)
直接通过org.eclipse.ui.menus扩展点为Move命令追加可见性过滤条件,适配单选、多选场景:
<extension point="org.eclipse.ui.menus"> <menuContribution locationURI="popup:org.eclipse.ui.popup.any?after=additions"> <command commandId="org.eclipse.ui.edit.move" label="Move"> <visibleWhen checkEnabled="false"> <not> <iterate ifEmpty="true"> <instanceof value="com.shashwat.resource.PResource"> </instanceof> </iterate> </not> </visibleWhen> </command> <!-- 如需屏蔽Java资源专属Move命令可追加以下配置 --> <command commandId="org.eclipse.jdt.ui.edit.text.java.move" label="Move"> <visibleWhen checkEnabled="false"> <not> <iterate ifEmpty="true"> <instanceof value="com.shashwat.resource.PResource"> </instanceof> </iterate> </not> </visibleWhen> </command> </menuContribution> </extension>
方案二:坚持使用org.eclipse.ui.activities实现
需要修改配置+新增选择监听代码动态控制activity状态:
- 修正扩展点配置,删除无效的
<enabledWhen>:
<extension point="org.eclipse.ui.activities"> <activity id="refactormovehiding.id" name="refactormovehiding"> </activity> <!-- 绑定通用Move命令 --> <activityPatternBinding activityId="refactormovehiding.id" pattern=".*/org.eclipse.ui.edit.move"> </activityPatternBinding> <!-- 绑定JDT专属Move命令 --> <activityPatternBinding activityId="refactormovehiding.id" pattern="org.eclipse.jdt.ui/org.eclipse.jdt.ui.edit.text.java.move"> </activityPatternBinding> </extension>
- 插件启动时注册全局选择监听器,动态切换activity激活状态:
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); window.getSelectionService().addPostSelectionListener(selection -> { IWorkbenchActivitySupport activitySupport = PlatformUI.getWorkbench().getActivitySupport(); Set<String> enabledActivities = new HashSet<>(activitySupport.getActivityManager().getEnabledActivityIds()); boolean hasPResource = false; // 遍历选中项判断是否包含PResource if (selection instanceof IStructuredSelection structuredSel) { for (Object obj : structuredSel.toList()) { if (obj instanceof PResource) { hasPResource = true; break; } } } if (hasPResource) { // 选中PResource时禁用activity,绑定的命令自动隐藏 enabledActivities.remove("refactormovehiding.id"); } else { // 其他场景激活activity,命令正常显示 enabledActivities.add("refactormovehiding.id"); } activitySupport.setEnabledActivityIds(enabledActivities); });
内容的提问来源于stack exchange,提问作者Shashwat
相关产品推荐
相关产品推荐

