You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除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状态:

  1. 修正扩展点配置,删除无效的<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>
  1. 插件启动时注册全局选择监听器,动态切换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 17:48:03