一篇不是推荐某个花哨的编辑器,而是把“本地写 Markdown”这件事从文件管理、写作体验、公式图片、批量处理到本地模型辅助,完整过一遍。如果你手里积累了大量的 .md 文件,或者正在考虑把博客草稿、技术笔记彻底迁到本地,那这篇文章可以直接收藏。
这套方案的主角是 Obsidian。它把一个本地文件夹当作知识库(vault),里面的笔记就是普通 Markdown 文件。你不需要把内容托管给某个云端服务,关闭网络也能正常写作;想要批量处理,直接把文件夹扔给 Python;想要写作辅助,可以接 Ollama 这类本地模型服务。和许多商业笔记软件相比,它最大的特点是“数据形态足够透明”,文件就是文件,不是进了某个封闭数据库就出不来。
接下来要做的实操包括:创建 vault、验证 Markdown/公式/图片/表格功能、安装并调用本地模型、用 Python 做批量任务,最后给一份常见问题排查清单。适合 CSDN 作者、技术文档维护者,以及所有想把笔记数据牢牢握在手里的本地写 MD 用户。
1. 核心能力速览
| 能力项 | 说明 |
|---|---|
| 主角工具 | Obsidian,免费使用,非开源,数据本地优先 |
| 数据存储 | 本地 vault 文件夹,笔记本质上是 .md 纯文本文件 |
| Markdown 能力 | 支持大部分通用 Markdown 语法、表格、任务列表、LaTeX 数学公式 |
| 图片路径 | 支持相对路径图片和 ![[图片名]] 内部链接,可配置附件目录 |
| 实时预览 | 编辑模式与阅读模式切换,公式和表格可直接渲染 |
| 批量处理 | 直接读 .md 文件用 Python/脚本处理,也可通过社区 API 插件做 HTTP 调用 |
| 本地大模型 | 可结合 Ollama 等本地推理服务,把 Markdown 文本交给本地模型润色、摘要、翻译 |
| 支持平台 | Windows、macOS、Linux |
| 启动方式 | 桌面客户端,或通过 obsidian:// 协议打开指定 vault |
| 适合场景 | 个人知识库、技术文档、CSDN 博客草稿、本地笔记、批量文档工作流 |
| 注意事项 | 非开源但数据可迁移;安装插件要选择可信来源;批量操作前先备份 |
从上表可以看出来,它的核心不是“编辑器本身有多炫”,而是“数据形态非常干净”。这也是本地写 Markdown 最重要的前提:工具可以换,但 .md 文件始终是你能直接操作的资产。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 适用场景与使用边界
这套方案最适合三类人:
第一类是 CSDN 技术作者。写博客草稿时通常要粘代码块、画表格、写数学公式,还要管理图片。用 Obsidian 做本地草稿库,写好后复制到博客后台,或者直接用 Pandoc 转成 Word,流程很顺。
第二类是技术文档维护者。很多项目文档就是 Markdown,直接用 vault 管理,配合 Git 做版本管理,每个文档的修改历史都清清楚楚。相比内部 Wiki 系统,纯本地 .md 文件夹没有平台绑定,哪天想换工具或做自动化处理都容易。
第三类是隐私敏感型用户。笔记内容不想上传到云端,也不想让第三方服务索引,那本地优先就是最稳妥的选择。只要不装奇怪的插件、不主动暴露接口,笔记默认不会离开本机。
再说不适合的场景:
- 大型团队实时协同编辑。Obsidian 默认是单机软件,多人同时在线编辑不是它的强项。
- 复杂富文本排版。它面向 Markdown 写作,如果你需要 Word 那种精细的页眉页脚、复杂分栏,应该导出后再处理。
- 需要原生图表编辑。虽然可以嵌入 PlantUML、Mermaid 等代码块,但最终还是要依赖渲染环境。
使用边界也要说清楚:Obsidian 虽然是免费软件但不是开源软件。它本地数据是开放的,但不是所有插件都经过严格审计,安装插件时要从社区库或可信来源获取。涉及隐私的数据不要发给第三方模型服务;本地模型也需要确认数据环境可控。生成内容发布前要人工复核,模型输出不代表事实正确。
3. 环境准备与前置条件
先看必装项:
- 操作系统:Windows 10/11、macOS 12 以上、主流 Linux 发行版都可以。
- Obsidian 本体:去官网下载对应安装包,安装后创建 vault。
- 一个本地文件夹:专门用来放 Markdown 笔记,建议放到容易备份的位置,比如
D:\MarkdownVault或~/Documents/md-vault。
可选安装项按需求增加:
| 工具 | 用途 |
|---|---|
| Git | 对 vault 做版本管理,防止误改误删 |
| Python 3.10+ | 编写批量处理脚本,统计字数、批量替换、调用本地模型 |
| Pandoc | 把 Markdown 转成 Word、HTML、PDF 等格式 |
| Ollama | 本地部署大语言模型,提供 HTTP API |
磁盘空间方面,纯 Markdown 笔记占空间非常小;真正占空间的是本地模型文件和图片附件。如果你要拉一个 7B 参数的量化模型,按照常见做法需要预留几个 GB 到十几 GB,具体以模型说明为准。
端口方面,Obsidian 本身不需要固定端口。如果你要跑 Ollama,它默认监听 127.0.0.1:11434;如果本机 11434 被占用,会听到服务启动失败或调用失败,排查时先看端口。建议把所有本地服务都只在回环地址监听,不要暴露到公网。
4. 安装部署与启动方式
4.1 安装 Obsidian 并创建 vault
安装完成后,启动软件会看到 vault 选择界面。选择“Create new vault”,然后指定一个本地文件夹。Obsidian 会在这个文件夹里生成 .obsidian 配置目录,你的笔记就是普通 .md 文件。
推荐目录结构:
text复制my-vault/
├── 00-inbox/ # 快速记录
├── 01-notes/ # 正式笔记
├── 02-projects/ # 项目文档
├── 90-assets/
│ ├── images/ # 图片附件
│ └── files/ # 其他文件
├── templates/ # 模板
└── scripts/ # 批量脚本
这个结构不是必须的,但建议提前定好。图片附件集中在 90-assets/images 里,Markdown 文件用相对路径引用,后续迁移、备份、批量处理都方便。
4.2 用命令行或 URI 打开 vault
Obsidian 支持通过 obsidian:// 协议打开指定 vault,比如:
text复制obsidian://open?vault=my-vault
不同版本对 URI 格式可能有差异,以官方帮助文档为准。这个方式适合配合脚本快速打开知识库,比如写一个批处理脚本,双击就进入指定 vault。
4.3 初始化 Git 版本管理
进入 vault 目录后执行:
bash复制cd my-vault
git init
git add -A
git commit -m "init vault"
之后每次写作前或批量处理前先提交一次。这里有个很实用的习惯:如果从远程仓库拉取更新,先提交本地修改再 git pull,避免出现“强制覆盖本地代码”那种丢内容的情况。
4.4 安装 Ollama 本地模型服务(可选)
如果你要接入本地大模型,先下载并安装 Ollama。启动服务后,拉取模型:
bash复制# 启动服务
ollama serve
# 另开一个终端,拉取并运行模型
ollama pull qwen2.5:7b
ollama run qwen2.5:7b
模型名、量化版本以 Ollama 官方库为准。如果显存不够,优先选择更小的模型或量化版本;CPU 推理也能跑,只是速度明显慢。
验证服务是否正常:
bash复制curl http://127.0.0.1:11434/api/tags
如果返回包含已安装模型的 JSON 列表,说明本地模型服务已经就绪。
5. 功能测试与效果验证
5.1 Markdown 基础写作测试
新建一个测试笔记,输入以下内容:
markdown复制# 测试文档
?> 这是一段引用文字。Markdown 列表和代码块都需要验证。
1. 第一项
2. 第二项
```python
print("hello local markdown")
| 名称 | 类型 | 状态 |
|---|---|---|
| demo | Markdown | 完成 |
code复制
预期结果是:列表顺序正确,代码块有独立区块,表格有完整表头。只要阅读模式渲染正常,说明基础 Markdown 工作正常。
### 5.2 图片路径测试
图片是本地 Markdown 写作最容易踩坑的地方。第一个要掌握的方案是相对路径:
```markdown

只要 demo.png 确实在 vault 的 90-assets/images 目录下,而且当前 Markdown 文件和图片的相对位置一致,图片就能正常显示。
Obsidian 也支持内部链接写法:
markdown复制![[demo.png]]
这种方式不用关心绝对路径,Obsidian 会在 vault 内自动查找同名附件。如果你在设置里把新附件默认位置固定为 90-assets/images,粘贴图片时会自动放到该目录,不容易乱。
如果移动了文件导致图片失效,可以右键笔记选择更新内部链接,Obsidian 会自动修正同一 vault 内的引用关系。
5.3 数学公式测试
本地写 Markdown 需要公式的场景很常见,比如算法笔记、科研日志、技术博客。Obsidian 默认用 LaTeX 语法渲染数学公式。行内公式用单美元符号:
markdown复制勾股定理:$a^2 + b^2 = c^2$。
块级公式用双美元符号:
markdown复制$$
\int_0^1 x^2 \, dx = \frac{1}{3}
$$
多行公式推荐使用 aligned:
markdown复制$$
\begin{aligned}
f(x) &= ax^2 + bx + c \\
g(x) &= \int_0^x f(t)\, dt
\end{aligned}
$$
分段函数和大括号多行公式推荐用 cases:
markdown复制$$
y = \begin{cases}
x, & x \ge 0 \\
-x, & x < 0
\end{cases}
$$
预期结果:阅读模式下公式渲染为数学排版;如果看到的是原始 LaTeX 代码,先检查 $ 或 $$ 是否配对,再检查有没有在代码块内部写公式。
5.4 表格复制与 Excel 转换测试
Markdown 表格直接复制到 Excel 时,偶尔会出现列错位的问题。更稳定的做法是先转成 CSV 或 HTML,再用 Python 处理。
用 Pandoc 先把 Markdown 转成 HTML:
bash复制pandoc input.md -o table.html
再用 pandas 读取表格并导出 Excel:
python复制import pandas as pd
tables = pd.read_html("table.html")
for i, df in enumerate(tables):
df.to_excel(f"table_{i}.xlsx", index=False)
这个流程对多个 Markdown 表格很友好。如果你的工作流里经常要把文档转成 Word 交付,Pandoc 是绕不开的工具。
5.5 本地大模型辅助测试
假设 Ollama 已经启动并拉取了模型,先用 curl 做一个最小验证:
bash复制curl http://127.0.0.1:11434/api/generate -d '{
"model": "qwen2.5:7b",
"prompt": "请用一句话总结:本地写 Markdown 的核心优势。",
"stream": false
}'
如果返回 JSON 且包含 response 字段,说明本地模型服务可用。接着可以把这一段逻辑接到写作流程里:复制当前 Markdown 笔记内容,交给模型做摘要、润色或翻译,再把结果贴回笔记。
这里要强调:本地模型输出和云端大模型一样会犯错,不要直接当作终稿使用,发布前务必人工复核。
5.6 批量脚本测试
本地 Markdown 的最大优势就是可以用脚本直接处理文件。先跑一个简单的统计脚本,了解 vault 里所有笔记的字数分布:
python复制from pathlib import Path
vault = Path("my-vault")
md_files = vault.rglob("*.md")
for f in md_files:
text = f.read_text(encoding="utf-8")
chinese_chars = sum(1 for ch in text if "\u4e00" <= ch <= "\u9fff")
words = len(text.split())
print(f"{f.relative_to(vault)}: 中文 {chinese_chars}, 英文/数字词约 {words}")
预期结果是每个 Markdown 文件输出一行统计信息。如果脚本能遍历全部 .md 文件,说明文件目录结构清晰,后续批量替换、批量导出、批量摘要都能建立在同一套逻辑上。
6. 接口 API 与批量任务
6.1 Obsidian 的接口能力边界
Obsidian 官方本身不提供面向普通用户的 HTTP API。想通过接口访问 vault,通常有两种方式。
第一种是用社区插件。有一类 Local REST API 插件可以在本机开启 HTTP 接口,让你通过请求读取和修改笔记。注意:这类插件的端口、鉴权 Token、请求格式各不相同,启用后要仔细阅读插件说明,并且只监听 127.0.0.1,不要暴露到公网。
第二种更稳定,也是我更推荐的方式:不依赖任何插件,直接使用 Python 读写 vault 文件夹。因为 vault 本身就是普通目录,Markdown 就是纯文本,所有批量任务都可以通过标准库或 requests 完成。
6.2 调用 Ollama 接口处理 Markdown
先写一个函数,读取 Markdown 文件并请求本地模型生成摘要:
python复制import pathlib
import requests
def summarize_md(path: pathlib.Path) -> str:
text = path.read_text(encoding="utf-8")[:4000]
resp = requests.post(
"http://127.0.0.1:11434/api/generate",
json={
"model": "qwen2.5:7b",
"prompt": "请用 200 字以内总结这篇 Markdown 笔记:\n\n" + text,
"stream": False,
},
timeout=300,
)
resp.raise_for_status()
return resp.json()["response"]
这里把 timeout 写得比较大,因为本地模型在 CPU 上推理时很慢,尤其是第一次处理长文本。如果超时时间太短,批量任务会频繁报错。
6.3 批量任务目录与失败重试
批量处理的核心是“先试一个,再跑全部”。写一个简单的批量框架:
python复制import json
import pathlib
md_files = list(pathlib.Path("my-vault").rglob("*.md"))
ok, failed = [], []
for f in md_files:
try:
summary = summarize_md(f)
output_path = f.parent / (f.stem + "_summary.md")
output_path.write_text(summary, encoding="utf-8")
ok.append(str(f))
except Exception as e:
failed.append({"file": str(f), "error": str(e)})
result = {"ok": ok, "failed": failed}
with open("batch_result.json", "w", encoding="utf-8") as fp:
json.dump(result, fp, ensure_ascii=False, indent=2)
运行前必须把 vault 备份或提交到 Git。批量任务如果中途卡住,先检查模型服务和端口;如果单个文件失败,不要急着重跑全部,修好错误后从失败清单断点续跑。
7. 资源占用与性能观察
本地 Markdown 方案分为两部分:Obsidian 本体和本地模型。
Obsidian 本身不是重型应用,纯编辑笔记时内存占用不高。但如果你安装了很多插件,并且 vault 里有大量图片、超长笔记、全文索引,内存和 CPU 占用会明显上升。判断方法是逐个关闭插件,观察内存占用变化,把不常用的插件停用,而不是全部常驻。
本地模型是资源占用大头。显存占用主要由三个因素决定:
- 模型参数规模。
- 是否量化。
- 上下文长度。
同样一个模型,FP16 原始权重和 Q4 量化权重差别很大;在模型处理超长文本时,上下文窗口也会显著提高显存占用。所以批量处理长文档时,建议一步只处理一段,别把整篇万字笔记一次性塞给模型。
观察资源占用可以用任务管理器,也可以用 NVIDIA 显卡命令:
bash复制nvidia-smi
这个命令能看到当前 GPU 显存使用情况,以及是哪个进程占用了显存。如果显存不够,优先换更小的模型、降低上下文长度,或者干脆用 CPU 推理。CPU 推理慢,但至少不会直接报显存不足。
端口检查同样重要。如果 Ollama 服务起不来,先查 11434 是否被占用:
bash复制# Windows
netstat -ano | findstr 11434
# Linux / macOS
lsof -i :11434
一旦发现端口冲突,修改 Ollama 的监听端口配置,或者处理占用端口的进程,再重启服务。
8. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
双击 .md 文件打不开 |
系统没有关联 Markdown 编辑器 | 右键查看“打开方式” | 选择 Obsidian 或 VS Code 作为默认程序 |
| 公式不渲染 | LaTeX 语法错误或 $ 不配对 |
检查 $、$$ 使用,查看阅读模式 |
修正公式语法,使用 aligned/cases 环境 |
| 图片不显示 | 相对路径失效或附件被移动 | 检查笔记所在目录和图片实际路径 | 把附件放进 vault 固定目录,更新内部链接 |
| 图片粘贴后路径乱 | 附件默认位置不统一 | 查看 Obsidian 的 Files & Links 设置 | 设置新附件默认保存到固定目录 |
| 表格复制到 Excel 错列 | 直接复制渲染后的 HTML 表格 | 先转 CSV 或 HTML | 用 Pandoc 转 HTML,再用 pandas 导出 Excel |
| Markdown 转 Word 排版丢失 | 转换器没带模板 | 检查 Pandoc 命令和模板配置 | 指定适合的 Pandoc 模板,复杂图表人工复核 |
| 本地模型服务没响应 | Ollama 未启动、模型未下载、端口错误 | curl 测试 /api/tags |
启动 ollama serve,拉取模型,确认端口 |
| 本地模型生成很慢 | CPU 推理或上下文过长 | 观察 nvidia-smi 和任务管理器 |
换小模型、降低上下文长度、分批处理 |
| 批量脚本改坏文件 | 未备份、异常未捕获 | 查看 Git 状态或文件内容 | 批量前 git commit,先单文件试跑,加错误日志 |
| 插件导致界面卡顿 | 安装过多插件 | 逐个停用插件观察变化 | 只保留常用的几个插件 |
排查时最常用的顺序是:看日志、看端口、看文件路径、看模型服务。本地 Markdown 方案和云端工具不同,它的问题通常都在本机可查可控。
9. 最佳实践与使用建议
先建立一套最小的可运行配置。不要一开始就装几十个插件,先让“创建 vault、写笔记、放图片、导出 Word”这个主流程跑通,再逐步加功能。
文件目录要分清楚。建议按 00-inbox、01-notes、02-projects、90-assets 四类建立,这样批量脚本只需要遍历少数几个顶层目录,不容易误处理模板和附件。
图片附件要集中管理。粘贴图片后立刻确认存放在 90-assets/images,Markdown 里统一用相对路径引用。这样备份和迁移都简单,不会出现图片存在系统临时目录、几个月后全部失效的问题。
批量处理前先备份。最简单的方式是 Git commit:
bash复制cd my-vault
git add -A
git commit -m "before batch task"
如果批量脚本写错了正则表达式,也能用 Git 找回原始文件,避免“强制覆盖本地代码”式的事故。
接口服务要注意边界。Ollama 默认监听本地回环地址,不需要修改就不要改成 0.0.0.0。如果你用了社区 API 插件,同样限制在 127.0.0.1,并设置访问 Token。任何暴露到局域网的接口都可能被其他机器扫描到,这不是危言耸听。
合规方面,本地模型只能处理你有权处理的文本。涉及他人隐私、版权内容时,不要把数据发给第三方大模型服务;即使是本地模型,也要确认数据集和输出内容的使用边界。对生成内容一律先复核再发布。
10. 总结与下一步
这套本地 Markdown 方案最值得尝试的点,是“纯本地 + 纯文本 + 可编程”。vault 里的文件从创建到备份到批量处理,每一步都不依赖某个云厂商的独家格式。对于 CSDN 作者和技术文档维护者来说,这种可控感比花哨的界面更重要。
如果你现在开始尝试,第一个要验证的功能是:写一篇包含代码块、表格、数学公式和图片的测试笔记,确认 Obsidian 阅读模式全部渲染正常,图片路径不丢。这一步过了,再谈本地模型和批量脚本。
最容易踩的坑有三个:插件装太多导致 Obsidian 卡顿;批量脚本没备份就全量跑;本地模型上下文太长导致显存不足。只要控制住这三点,整套方案基本不会出大问题。
后续可以继续扩展的方向包括:用 Git 自动提交笔记历史,用 Pandoc 接入固定格式的 Word 导出工作流,用 Ollama 给笔记批量生成摘要,甚至把 CSDN 的 Markdown 草稿整理成规范目录,再通过自动化脚本做发布前检查。把核心流程跑通之后,本地写 Markdown 就不再是“找个编辑器打开文件”,而是一套能持续积累、方便接管的数据基础。
