关闭重复标签

this.app.workspace.onLayoutReady(() => {
	this.registerEvent(
		this.app.workspace.on("active-leaf-change", (activeLeaf) => {
			const filePath = activeLeaf?.view.getState().file;
			if (!filePath) return;
			const viewType = activeLeaf?.view.getViewType();
			// 获取已存在的其他叶子
			let repeatLeaves = this.app.workspace.getLeavesOfType(viewType).filter((leaf) =>
				// 不包含新打开的叶子
				leaf !== activeLeaf &&
				// 限制同一个分割窗口下的叶子
				//leaf.parent.id === activeLeaf.parent.id &&
				// 筛选文件路径相同的叶子
				leaf.view?.getState().file === filePath
			)
			if(repeatLeaves.length > 0) {
				repeatLeaves.push(activeLeaf)
				// 排序规则,pinned优先,相同条件下,最先打开的优先
				repeatLeaves = repeatLeaves.sort((leaf1, leaf2) => {
					// 如果 leaf1 被固定但 leaf2 没有,leaf1 在前
					if (leaf1.pinned && !leaf2.pinned) return -1;
					// 如果 leaf2 被固定但 leaf1 没有,leaf2 在前
					if (!leaf1.pinned && leaf2.pinned) return 1;
					// 当两者都 pinned 或者都没有 pinned 的情况,根据 activeTime 排序
					const leaf2ActiveTime =leaf2.activeTime || Date.now()
					if (leaf1.activeTime !== leaf2ActiveTime) {
						// 时间早的在前
						return leaf1.activeTime - leaf2ActiveTime;
					}
					// activeTime 相同的情况下,保持原顺序
					return 0;
				});

				// 激活排序后的第一个叶子
				const newActiveLeaf = repeatLeaves.shift();
				this.app.workspace.setActiveLeaf(newActiveLeaf, { focus: true });

				// 关闭排序后的其他叶子
				repeatLeaves.forEach((leaf) => {
					leaf?.detach()
				});
			}
			// 如果设置为默认锁定体验更佳,但锁定的叶子关闭需要点击两次或者右键关闭
			// 这样相当于每次都新标签打开
			// setTimeout(() => {
			// 	const currActiveLeaf = this.app.workspace.getActiveViewOfType(ItemView)?.leaf;
			// 	if(!currActiveLeaf?.pinned) currActiveLeaf?.setPinned(true);
			// }, 42);
		})
	)
})