- 知识管理
- 知识库
- 开发工具
- MCP 服务
【免费下载链接】foam
A personal knowledge management and sharing system for VSCode
Foam 的个人知识管理(PKM)体系建立在"工作区"(Workspace)之上——一个存放 Markdown 笔记的文件夹,配合 VS Code 扩展即可获得 wikilinks、反向链接、图谱视图与每日笔记等能力。本文以 first-workspace.md 为主线,从工作区概念讲起,给出"模板创建"与"从零搭建"两种实战路径,并结合本仓库源码剖析工作区背后的模板引擎、每日笔记与配置解析机制,帮你快速搭建一个可长期扩展的数字花园。
理解 Foam 工作区:一个装满 Markdown 的文件夹
Foam 工作区的本质非常简单:一个包含 Markdown 文件(.md)的文件夹,也就是你的笔记本身。除此之外,它还可以(可选地)包含:
- 配置文件(Configuration files)——VS Code 设置与 Foam 偏好,典型如
.vscode/settings.json - 资产(Assets)——图片、附件与其他媒体文件
- 模板(Templates)——可复用的笔记结构,默认存放在
.foam/templates/目录
从源码看,Foam 核心对工作区的识别是"文件夹 + Markdown 文件"这一极简模型。在 config.ts 的默认配置中,文件包含规则为**/*,默认笔记扩展名为.md,附件扩展名覆盖pdf mp3 webm wav m4a mp4 avi mov rtf txt doc docx pages xls xlsx numbers ppt pptm pptx等,模板文件夹默认为.foam/templates。也就是说,你不需要任何额外的初始化动作,Foam 会以零配置的方式把文件夹当作工作区启动。
单一工作区 vs 多个工作区
| 方案 | 定位 | 特点 |
|---|---|---|
| 单一工作区(推荐) | 统一知识库原则 | 所有知识集中一处;链接发现与图谱可视化效果更好;更易维护与备份 |
| 多个工作区(已弃用) | 仅限高级用户 | 分离职业与个人知识、隔离敏感信息、为不同项目配置不同工作流 |
官方文档明确提示:多工作区方案已被标记为 deprecated,未来可能不再支持。如果你确实需要模拟复杂工作区结构,可以通过文件/文件夹链接(file/folder links)来实现,而不是创建多个 VS Code 工作区。这也是 Foam 强调"统一知识库"(unified knowledge base)理念的直接体现。
方法一:使用 Foam 模板创建(推荐)
对大多数用户而言,最快的方式是使用官方预配置的 foam-template 模板仓库。
第 1 步:从模板创建仓库
- 打开
foambubble/foam-template模板仓库主页(github.com/foambubble/foam-template); - 点击"Use this template"(需要 GitHub 账号);
- 为仓库命名(例如
john-knowledge-base、my-second-brain); - 选择可见性:
- Private(私有)——适合个人笔记(推荐);
- Public(公开)——如果你希望公开分享知识。
第 2 步:克隆到本地
git clone https://github.com/yourusername/your-repo-name.git cd your-repo-name第 3 步:在 VS Code 中打开
- 启动 VS Code;
- 执行File > Open Folder;
- 选择刚克隆的仓库文件夹。
模板仓库自带了一组开箱即用的.vscode/settings.json配置与推荐扩展清单,打开后 VS Code 会提示安装推荐扩展(见 recommended-extensions.md,其中包含 Foam for VSCode、Markdown All In One、Prettier 三项自动推荐的扩展),确认后即可开始写作。
方法二:从零开始搭建
如果你想要最小化配置,只需要:
- 在电脑上新建一个文件夹;
- 在 VS Code 中打开该文件夹(File > Open Folder)。
仅此而已——剩下的交给 Foam:你可以直接开始编写 Markdown 文件,wikilinks、反向链接、图谱等能力会自动生效。
已经拥有 Obsidian 仓库?可以直接在 VS Code 中打开它,无需迁移——参见 migrating-from-obsidian。Obsidian 的 vault 本质上就是 Markdown 文件夹,与 Foam 工作区结构一致,两者可以并存使用同一目录。
让你的知识库更实用:三种初始化实践
工作区建立后,官方文档推荐按以下三个方向做初始配置,让知识库从"能跑"走向"好用"。
1. 定制你的设置
打开.vscode/settings.json,按个人偏好调整:
- 每日笔记位置(Daily notes location)——每日笔记文件存放在哪个目录;
- 图片处理(Image handling)——粘贴的图片如何组织归档;
- 链接格式(Link format)——wikilinks 是否带文件扩展名。
这里值得一提的是链接格式的实际影响:Foam 的 wikilinks 支持"标识符链接"(如[[filename]]、[[folder/filename]])与"路径链接"(如[[./file]]、[[../other/file]]),详见 wikilinks.md。若你的笔记需要与标准 Markdown 处理器兼容,Foam 还能自动生成 link-reference-definitions 到文件末尾。
2. 建立你的收件箱(Inbox)
创建inbox.md作为默认的快速捕获入口:
# Inbox Quick notes and ideas go here before being organized. ## Today's Captures - ## To Process - ## Ideas -收件箱的价值在于"先捕获、后整理":随手记下的想法先进入收件箱,再在定期回顾时归档到正式笔记,避免打断当前思路。
3. 创建核心结构笔记
Foam 不强制任何组织方法论("Foam is not opinionated"),唯一的建议是先开始,再逐步改进。用户社区最常采用的两套方法是 PARA 与 Zettelkasten。
PARA 方法——围绕四个类别组织:
- Projects(项目)——有截止日期的事情;
- Areas(领域)——持续性的责任范围;
- Resources(资源)——未来参考的材料;
- Archive(归档)——不再活跃的内容。
Zettelkasten 方法——基于编号的原子化想法系统:
- 永久笔记(Permanent notes)——
202501251030-idea-title.md这类带时间戳的命名; - 文献笔记(Literature notes)——
book-author-year.md; - 索引笔记(Index notes)——
index-topic.md。
两种方法可以混用:PARA 负责粗粒度的目录划分,Zettelkasten 负责笔记间的细粒度关联,最终都通过 wikilinks 连接成网。
配置每日笔记
每日笔记适合日常规划与反思、会议记录、日记、快速捕获等场景。工作区建好后,官方文档建议立即验证每日笔记是否工作正常:
- 按
Ctrl+Shift+P(macOS 为Cmd+Shift+P)打开命令面板; - 输入"Foam: Open Daily Note";
- 验证笔记是否创建在正确的位置。
更快的替代方式是快捷键:Alt+D打开今天的每日笔记,Alt+H打开其他日期的每日笔记。
从源码看,该命令由 open-daily-note.ts 注册为foam-vscode.open-daily-note,内部调用openDailyNoteFor(new Date(), foam)完成创建;同时它还支持openDailyNote.onStartup配置,在 VS Code 启动时自动打开每日笔记:
{ "foam.openDailyNote.onStartup": true }默认情况下,每日笔记以yyyy-mm-dd.md命名并存放于工作区的journals文件夹。想要自定义位置与格式,最推荐的方式是创建.foam/templates/daily-note.md模板(旧版openDailyNote.*设置已弃用并将被移除,请改用模板):
--- type: daily-note --- # Daily Note - $FOAM_DATE_YEAR-$FOAM_DATE_MONTH-$FOAM_DATE_DATE ## Tasks - [ ] ## Notes模板中的FOAM_DATE_*系列变量由 variable-resolver.ts 统一定义与解析,包括FOAM_DATE_YEAR(四位年份)、FOAM_DATE_MONTH(两位月份)、FOAM_DATE_DATE(两位日期)、FOAM_DATE_WEEK(ISO 周数)、FOAM_DATE_DAY_ISO(ISO 星期编号,周一=1)等。与 VS Code 原生CURRENT_YEAR等变量相比,FOAM_DATE_*的一个重要优势是:当使用相对每日笔记片段(如/tomorrow)创建笔记时,变量会填充相对日期而非当前日期,行为符合直觉。
链接到上一篇每日笔记
$FOAM_PREVIOUS_DAILY_NOTE变量会展开为创建笔记之前最近存在的一篇每日笔记——它会跳过空缺日期,因此经过周末或假期后,它指向你实际写过的最后一篇笔记,而/yesterday总是严格指日历上的前一天:
--- type: daily-note --- # $FOAM_DATE_YEAR-$FOAM_DATE_MONTH-$FOAM_DATE_DATE Previously: [[$FOAM_PREVIOUS_DAILY_NOTE]]第一篇每日笔记没有"上一篇",该变量会展开为空。可以为其提供回退值:
Previously: ${FOAM_PREVIOUS_DAILY_NOTE:nothing yet}该变量仅在每日笔记模板中可用,其实现原理相当精妙:Foam 通过逆向解析每日笔记模板的filepath模式来识别已有笔记。在 daily-note-path-pattern.ts 中,路径模式被解析为"字面量 + 日期 token"的序列,再编译成正则表达式反向读取日期;previous-daily-note.ts 则扫描整个工作区、按日期比较找出最接近的一篇。由此可以推导出几个使用约束:
- 模板路径必须用数字拼出年、月、日——
/journal/$FOAM_DATE_YEAR-$FOAM_DATE_MONTH-$FOAM_DATE_DATE.md或$FOAM_TITLE均可;使用月份名称($FOAM_DATE_MONTH_NAME)或周数($FOAM_DATE_WEEK)的路径无法被反向解析,变量会保持为空、显示回退值; - 修改过路径后,旧路径下已存在的每日笔记不再被识别;
- JavaScript 模板在运行时才决定路径,因此该变量在其中为空——JS 模板需要自行查找上一篇笔记。
日期片段(Date Snippets)
在任意笔记中输入以下片段可快速创建指向近期每日笔记的链接:
| 片段 | 日期 |
|---|---|
/today | 今天 |
/tomorrow | 明天 |
/yesterday | 昨天 |
/monday | 下周一 |
/+1d | 明天 |
/-3d | 3 天前 |
/+1w | 一周后 |
/-1m | 一个月前 |
/+1y | 一年后 |
片段触发后默认直接创建对应笔记(配置项foam.dateSnippetsAfterCompletion可改为noop或navigateToNote,见 config.ts)。在终端环境中也可以使用foam daily命令操作每日笔记,详见 CLI daily 命令文档。
新工作区的最佳实践
1. 从小开始(Start Small)
- 只从几篇笔记起步;
- 不要一开始就过度组织;
- 让结构自然生长。
2. 使用模板(Use Templates)
- 为常见笔记类型创建模板;
- 保持同类笔记的一致性;
- 节省重复排版时间。
Foam 的模板体系完整支持 Markdown 模板(.md,含$FOAM_TITLE、$FOAM_SELECTED_TEXT、$FOAM_CURRENT_DIR、$FOAM_SLUG等变量与 tab stop)和 JavaScript 模板(.js,可基于星期几、触发上下文动态生成内容并自定义文件路径),两者统一由 note-creation-engine.ts 这一"统一引擎"处理——processTemplate根据模板类型分发到executeJSTemplate或executeMarkdownTemplate。默认模板的查找顺序是.foam/templates/new-note.js→.foam/templates/new-note.md,每日笔记模板则为daily-note.js→daily-note.md(见 template-discovery.ts)。完整语法请参考 templates.md。
3. 尽早且频繁地建立链接(Link Early and Often)
- 大胆使用
[[wikilinks]]; - 不必担心建立"完美"的链接;
- Foam 会优雅地处理坏链接。
这是 Foam 体验中非常独特的一点:指向不存在笔记的 wikilinks 会生成占位符(placeholder),在编辑器中以不同样式高亮,点击即可创建对应笔记。从 note-creation-triggers.ts 可以看到,Foam 将"从占位符创建笔记"建模为一种独立的触发类型placeholder(携带来源笔记的 URI、标题与位置),与命令触发(command)并列。因此你可以先规划知识结构、再逐步填充内容,占位符天然承担了"待办蓝图"的角色。
4. 定期回顾(Regular Reviews)
- 每周做一次工作区清理;
- 归档已完成的项目;
- 识别缺失的连接(孤儿笔记可通过 orphans 工具 发现)。
同步与备份
Foam 基于纯文件工作,因此你可以自由选择任何备份方案叠加其上。
Git 同步
你的工作区本身就是一个 Git 仓库:
git add . git commit -m "Add new notes and ideas" git push origin main也可以借助其他 VS Code 扩展管理 Git 同步(例如 GitDoc 实现自动 Git 同步,或直接使用 VS Code 内置的Git: Commit All命令)。详细的同步实践可参考 sync-notes.md。
其他同步方式
- 云存储——Dropbox、OneDrive、Google Drive;
- 本地备份——Time Machine、File History;
- 手动导出——定期制作 ZIP 备份。
下一步
工作区搭建完成后,你可以继续学习:
- note-taking-in-foam——掌握 Markdown 与高效笔记写作;
- navigation——用 wikilinks 连接你的想法;
- graph view——可视化你的知识网络;
- templates——标准化你的笔记创建流程。
获取帮助
遇到搭建问题时的求助路径:
- 查看 Installation Guide 确认前置条件(VS Code 安装、Foam 扩展安装、推荐扩展与可选 Foam CLI:
npm install -g foam-cli); - 阅读 frequently-asked-questions 排查常见工作区问题(如链接/图谱/反向链接不生效时,先确认推荐扩展是否齐全、是否执行过
Developer: Reload Window、链接格式是否符合 wikilinks 规则); - 加入 Foam 社区 Discord 获取实时交流。
附录:源码延伸阅读
如果你想深入理解工作区背后的实现,以下仓库路径值得一读:
- note-creation-engine.ts——Markdown/JavaScript 模板的统一处理引擎与文件路径净化逻辑;
- variable-resolver.ts——
FOAM_*系列变量的定义与解析(含全部FOAM_DATE_*变量); - daily-note-resolver.ts——每日笔记内容与路径的解析入口,无 VS Code 依赖,CLI 与扩展共用;
- daily-note-path-pattern.ts——每日笔记路径模式的正向生成与逆向识别;
- previous-daily-note.ts——
FOAM_PREVIOUS_DAILY_NOTE的实现(扫描工作区、按天比较); - config.ts——全部 Foam 配置项的默认值与层级合并机制;
- daily-note-path-pattern.test.ts——路径逆向解析的测试用例,直观展示哪些路径模式可被识别。
理解了"工作区 = 文件夹 + Markdown 文件"这一核心模型,再结合模板与每日笔记机制,你就能在 Foam 中搭建一个既简单、又可随知识规模平滑扩展的个人知识管理系统。
- 知识管理
- 知识库
- 开发工具
- MCP 服务
【免费下载链接】foam
A personal knowledge management and sharing system for VSCode
相关推荐
Foam for VS Code 深度指南:用 Markdown + Wikilinks 构建本地优先的个人知识库
Foam for VS Code 深度指南:用 Markdown + Wikilinks 构建本地优先的个人知识库 Foam 是一款运行在 VS Code 之内
知识管理知识库开发工具MCP 服务Foam 入门指南:在 VS Code 上构建基于 Wikilink 的个人知识管理系统
Foam 入门指南:在 VS Code 上构建基于 Wikilink 的个人知识管理系统 本文是一份以 Foam 项目官方文档为主线的完整入门指南,围绕「Foa
知识管理知识库开发工具MCP 服务Yuxi-Know入门指南:5分钟搭建你的第一个智能知识库
Yuxi Know入门指南:5分钟搭建你的第一个智能知识库 Yuxi Know(语析)是一个基于大模型的RAG知识库与知识图谱智能问答平台,能够快速将各种文档转
人工智能大模型AI AgentRAG多智能体知识图谱后端前端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考