一个专业级的 VS Code 插件,实现 Shadow Vault(影子库)架构,自动将项目的文档目录挂载到 Obsidian 中心库,提供多位置的一键跳转功能。
- 智能检测:插件启动时自动检测并挂载现有的
docs目录 - 实时监听:监听文件创建和重命名事件,自动挂载新建的
docs文件夹 - Windows 兼容:使用
junction类型软连接,无需管理员权限 - 幂等性保护:避免重复创建链接,确保系统稳定
提供 5 种跳转方式,满足不同使用场景:
| 方式 | 位置 | 触发方式 |
|---|---|---|
| 📖 状态栏 | 底部右侧 | 点击 |
| 📖 资源管理器标题 | 左侧顶部工具栏 | 点击 |
| 📖 侧边栏行内 | 文件列表中 | 鼠标悬停后点击 |
| 📖 编辑器右上角 | 编辑器标签页右侧 | 点击(仅 .md 文件) |
| ⌨️ 快捷键 | 任意位置 | Alt + O |
- 支持自定义 Obsidian 中心库路径
- 状态栏按钮智能显示(仅编辑 Markdown 文件时显示)
- 自动创建
.keep文件确保 Git 能追踪空目录
# 克隆项目
git clone <repository-url>
cd obs
# 安装依赖
bun install
# 构建插件
bun run build- 按
F5启动扩展开发主机 - 新窗口会打开,插件已自动加载
在 VS Code 设置中搜索 Obsidian Connector,配置以下选项:
| 配置项 | 默认值 | 说明 |
|---|---|---|
obsidianConnector.centralVaultPath |
H:\main\ObsidianNotes |
Obsidian 中心库的绝对路径 |
{
"obsidianConnector.centralVaultPath": "D:\\Obsidian\\MyNotes"
}# 创建中心库目录
mkdir "H:\main\ObsidianNotes"
# 在 Obsidian 中打开这个目录作为 Vault方式一:新建 docs 目录
- 在 VS Code 项目中创建
docs文件夹 - 插件自动检测并挂载到 Obsidian 中心库
- Obsidian 侧自动显示
[项目名]-Docs文件夹
方式二:重命名现有文件夹
- 将任意文件夹重命名为
docs - 插件自动检测并执行挂载
打开任意 Markdown 文件,使用以下任一方式跳转:
- 点击底部状态栏的
📖 Obsidian按钮
- 点击左侧资源管理器顶部的
📖图标
- 鼠标悬停在侧边栏的
.md文件上 - 点击文件名右侧出现的
📖图标
- 点击编辑器标签页右侧的
📖图标(仅 Markdown 文件)
- 按
Alt + O快速跳转
插件提供调试命令,帮助排查问题:
- 按
Ctrl+Shift+P打开命令面板 - 输入
Debug: Obsidian Path - 选择该命令查看当前文件的详细信息
调试信息包括:
- 原始路径
- 真实物理路径
- 规范化路径(正斜杠)
- 中心库配置路径
- 项目名称
- 完整的 Obsidian URI
可执行操作:
- 复制:将调试信息复制到剪贴板
- 打开路径:用默认程序打开文件
- 测试 URI:直接测试生成的 Obsidian URI
- 按
Ctrl+Shift+I打开 VS Code 开发者工具 - 切换到
Console标签页 - 查看插件的日志输出
项目结构
├── extension/
│ ├── index.ts # 主入口,包含挂载和跳转逻辑
│ ├── utils.ts # 工具函数(mountDocsToObsidian)
│ └── views/
│ ├── panel.ts # React Webview 面板
│ └── helper.ts # 辅助函数
└── src/
└── utils/
└── vscode.ts # VS Code 工具函数
export async function mountDocsToObsidian(
projectDocsPath: string,
centralVaultProjectsPath: string
)功能:
- 检测并创建软连接(Windows 使用
junction) - 幂等性保护,避免重复创建
- 自动创建
.keep文件 - 完善的错误处理和用户提示
启动时检测:
const checkAndMount = async () => {
// 检测 docs 目录并执行挂载
}
checkAndMount();文件创建监听:
const createWatcher = workspace.onDidCreateFiles(async (event) => {
// 监听 docs 目录创建
});文件重命名监听:
const renameWatcher = workspace.onDidRenameFiles(async (event) => {
// 监听文件夹重命名为 docs
});commands.registerCommand('obsidianConnector.jumpToObsidian', async () => {
// 1. 获取当前文件路径
// 2. 解析真实物理路径
// 3. 构建 Obsidian URI
// 4. 唤起外部应用
});URI 格式:
- 方案 A(推荐):
obsidian://open?vault=<库名>&file=<相对路径> - 方案 B(备用):
obsidian://open?file=<完整路径>
为什么使用 Junction?
| 特性 | Symlink | Junction |
|---|---|---|
| 权限要求 | 需要管理员权限 | 不需要 |
| 支持平台 | 文件 + 目录 | 仅目录 |
| 跨盘符支持 | ❌ | ✅ |
| Obsidian 兼容性 | ✅ 完美兼容 |
实现代码:
const type = process.platform === 'win32' ? 'junction' : 'dir';
await fs.symlink(projectDocsPath, linkPathInObsidian, type);解决方案:
- 开启 Windows 开发者模式
- 或者以管理员身份运行 VS Code
原因:
- Obsidian URI 格式错误
- 路径未在已打开的 Obsidian 库中
解决方案:
- 确保在 VS Code 设置中正确配置了
obsidianConnector.centralVaultPath - 确保 Obsidian 已打开该库
- 使用调试命令检查生成的 URI
可能原因:
- Obsidian 需要重新加载库
- 文件索引未完成
解决方案:
- 在 Obsidian 中按
Ctrl+R重新加载 - 等待文件索引完成
解决方案:
- 插件已自动在
docs目录中创建.keep文件 - 确保
.gitignore未忽略.keep文件
在 Obsidian 中创建跨项目的知识关联:
# Project-B 文档
参见 [[Project-A-Docs#接口定义]] 了解 API 详情输入层:在 Obsidian 总库里写需求、画架构图
↓
触发层:VS Code 插件监听总库变化
↓
执行层:AI 读取任务,在物理路径生成代码
# 安装依赖
bun install
# 开发模式
bun run dev
# 生产构建
bun run build# 使用 Biome 格式化代码
bunx biome check --write- 构建工具:Vite
- 框架:React 19
- 语言:TypeScript
- 文件操作:fs-extra
- 代码规范:Biome (ultracite)
MIT License
欢迎提交 Issue 和 Pull Request!
如有问题或建议,请通过 GitHub Issues 联系。