IDEA 项目视图保存节点展开状态
没兴趣看过程的,请直接跳转到解决方案。
问题现象
IDEA 折叠再展开之后,之前展开的状态就没有了(若 gif 未自动播放,可在新标签页打开):
不像 Eclipse 可以保存展开状态,不用再一层层展开。
问题分析
项目视图设置
首先看看项目视图里面有没有对应的设置,然而没有:
模仿 Foldable ProjectView 写个折叠记忆插件
参考了好多资料,完成 IDEA 插件开发(一):菜单及气泡通知。
然后又把插件 Foldable ProjectView 的 Kotlin 源码通读了一遍(期间学了一下 Kotlin),并添加了注释,已经上传到 Gitee。
最终发现该插件只是把符合指定规则的文件和文件夹从项目视图节点(ProjectViewNode)上剔除,然后新建一个自定义的项目视图节点,将剔除的都挂在新节点下面:
查看 ProjectViewNode 及相关类源码,并没有找到记录节点折叠状态的字段,这插件是写不出来了。
官方论坛查找
去官方论坛 查找 Project View Expand,翻了几页后,终于看到一个提问 How to collapse/expand project files like eclipse? ,打开里面给出的链接 Collapsing tree node does not collapses all subnodes (regression),可以看到在 2017.3.3 版本以前,是可以保存折叠状态的。
翻到最下面,Da Wang 给出了解决方案。
解决方案
Help | Edit Custom Properties...(如果出现对话框,请按 Create),
idea.properties 文件将打开,添加一行 ide.tree.collapse.recursively=false
重新启动 IDEA 即可:
不知道为什么新版本不生效,查看 com.intellij.ui.treeStructure.Tree.java#collapsePath(TreePath path)
源码:
@Override
public void collapsePath(TreePath path) {
// 从 AdvancedSettings 中获取递归折叠配置
int row = AdvancedSettings.getBoolean("ide.tree.collapse.recursively") ? getRowForPath(path) : -1;
if (row < 0) {
super.collapsePath(path);
}
else if (!isAlwaysExpanded(path)) {
ArrayDeque<TreePath> deque = new ArrayDeque<>();
deque.addFirst(path);
while (++row < getRowCount()) {
TreePath next = getPathForRow(row);
if (!path.isDescendant(next)) break;
if (isExpanded(next)) deque.addFirst(next);
}
deque.forEach(super::collapsePath);
}
}
如源码所示,新版本应该在 Advanced Settings 中配置:
- Windows and Linux: File | Settings | Advanced Settings
- macOS: IntelliJ IDEA | Preferences | Advanced Settings