RCP项目中如何在Project Explorer隐藏以点开头的文件夹
解决Project Explorer中隐藏以点开头文件夹的问题
我来帮你搞定这个问题!你的commonFilter配置没生效,大概率是过滤表达式不完整,或者漏了把filter绑定到Project Explorer的关键步骤,下面一步步给你讲清楚正确的配置方式:
1. 补全并修正Common Filter的扩展配置
你的代码片段截断了,先给你一个完整且正确的配置,重点是filterExpression部分:
<extension point="org.eclipse.ui.navigator.navigatorContent"> <commonFilter description="隐藏以点(.)开头的文件夹" id="com.xyz.commonFilter.hideDotFolders" name="隐藏点前缀文件夹" activeByDefault="true"> <filterExpression> <and> <!-- 可选:如果只想隐藏文件夹,加上这一行;要隐藏所有点开头资源就去掉 --> <test property="org.eclipse.core.resources.type" value="FOLDER"/> <!-- 正则匹配以点开头的资源名称,这是核心 --> <test property="org.eclipse.core.resources.name" value="^\..*" match="regex"/> </and> </filterExpression> </commonFilter> </extension>
重点说明:
- 正则表达式
^\..*才是正确匹配以点开头的资源,如果你之前写的是.*,那会匹配所有资源,肯定不对。 - 加上
org.eclipse.core.resources.type的判断,可以只过滤文件夹,避免误隐藏以点开头的文件(比如.gitignore这类你可能想保留的文件)。
2. 必须绑定Filter到Project Explorer Viewer
光定义filter还不够,得让Project Explorer知道要加载这个filter,所以要加一个org.eclipse.ui.navigator.viewer扩展:
<extension point="org.eclipse.ui.navigator.viewer"> <viewerActionBinding viewerId="org.eclipse.ui.navigator.ProjectExplorer"> <includes> <actionExtension pattern="com.xyz.commonFilter.hideDotFolders"/> </includes> </viewerActionBinding> </extension>
这里的pattern要和你上面定义的commonFilter的id完全一致,别写错了!
3. 验证配置的小技巧
重启你的RCP应用后,打开Project Explorer右上角的小三角菜单,选择「Filters and Customization」,看看你的filter是不是已经在列表里并且被勾选了:
- 如果没出现,检查扩展ID有没有拼写错误,或者是不是和其他插件的ID冲突了。
- 如果勾选了但还是没生效,打开正则表达式测试工具,确认
^\..*能匹配你的目标文件夹(比如.settings、.gradle这类)。
编程方式的备选方案(如果扩展配置还是搞不定)
要是觉得扩展配置太麻烦,或者需要动态控制过滤规则,也可以用代码直接给Project Explorer加过滤逻辑:
// 获取Project Explorer的视图实例 IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); IViewPart projectExplorer = page.findView("org.eclipse.ui.navigator.ProjectExplorer"); if (projectExplorer instanceof CommonNavigator) { CommonNavigator navigator = (CommonNavigator) projectExplorer; TreeViewer viewer = (TreeViewer) navigator.getCommonViewer(); // 添加自定义过滤规则 viewer.addFilter(new ViewerFilter() { @Override public boolean select(Viewer viewer, Object parentElement, Object element) { if (element instanceof IResource) { IResource resource = (IResource) element; String name = resource.getName(); // 只隐藏以点开头的文件夹,其他资源都显示 return !(resource.getType() == IResource.FOLDER && name.startsWith(".")); } return true; } }); }
这个方式更灵活,比如你可以加个开关,让用户手动控制要不要隐藏这些文件夹。
内容的提问来源于stack exchange,提问作者Travelling Salesman
相关产品推荐
相关产品推荐

