多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

用 Vim、Markdown、Pandoc 与 Markor 搭建一套跨设备的纯文本笔记系统

用 Vim、Markdown、Pandoc 与 Markor 搭建一套跨设备的纯文本笔记系统 移动开发【免费下载链接】markorText editor - Notes ToDo (for Android) - Markdown, todo.txt, plaintext, math, ..项目地址https://gitcode.com/gh_mirrors/ma/markor点击查看免费下载本文以 Markor 开源仓库收录的《How I Take Notes With Vim, Markdown, and Pandoc》作者 James Vaughan2018 年 5 月为蓝本完整还原这套桌面端 Vim Vimwiki 编辑、手机端 Markor 管理、Syncthing 同步、Pandoc 生成网页与 PDF的笔记工作流并对照 Markor 仓库源码解释其底层实现。读完你就能照着文中的目录结构、index.md索引页和两份 Makefile从零搭建一套属于自己的、纯文本优先的跨设备知识库。一、这套系统的全景先看作者的tl;dr它一句话概括了整套架构我在电脑上用 Vim 和 Vimwiki 写 Markdown 笔记在手机上用 Markor 编辑用 Syncthing 保持同步最后用 pandoc 把笔记转成网页和 PDF 来阅读。拆解开来就是四条明确的分工环节工具职责编辑桌面Vim Vimwiki纯键盘工作流链接式导航笔记编辑移动Markor在手机上浏览笔记目录、格式化编辑 Markdown同步Syncthing让同一份笔记文件在多台设备间保持一致渲染/导出pandoc把 Markdown 转成 HTML 网页、PDF 等多种格式这套系统并非只用于课堂笔记。作者明确列出的笔记对象还包括读过的书、看过的电影、重要对话、关于人的有趣发现、正在做的项目、菜谱、以及未来的博客文章灵感——本质上是一套个人知识库而不仅仅是记课堂笔记的工具。二、为什么最终选择纯文本 Vim2.1 一段笔记工具的更迭史作者回顾了自己尝试过的工具纸笔、Google Docs、Evernote、Simplenote。其中纸笔坚持得最久但最终被放弃——因为对多数场景而言在电脑上检索和格式化笔记的价值超过了手写笔记的额外表现力。Evernote 和 Simplenote 本身是优秀的工具但作者明确表示更愿意把笔记保存在文件系统中的普通文件里这样想怎么组织、修改、解析都行。这正是 Markor 的核心哲学——项目 README 明确写道Created files are interoperable with any other plaintext software on any platform创建的文件可与任何平台上任何纯文本软件互操作并且Compatible with any other plaintext software on any platform -- edit with notepad or vim, filter with grep, convert to PDF or create a zip archive可用记事本或 vim 编辑、用 grep 过滤、转成 PDF 或打包成 zip。2.2 为什么不是 LaTeX作者遇到的第二个问题是编辑器与标记语言的选择。Vim 不是所见即所得WYSIWYG编辑器但作者需要标题、列表、表格、数学公式这类排版能力因此必须选一种标记语言。起初考虑 LaTeX——因为它熟悉且默认样式漂亮但发现 pandoc 之后最终选择了 Markdown用简单的 Markdown 写文档再通过 pandoc 转成 LaTeX 排版的 PDF、HTML 页面以及一大堆其他格式。这个选择在移动端同样成立Markor 的 Markdown 渲染基于 flexmark-java 实现详见下文源码级解析一节支持的扩展包括表格、任务列表、数学公式KaTeX、目录TOC等让手机端也能获得接近桌面的渲染体验。三、组织方式一个目录 一个索引页3.1 目录结构作者把绝大多数笔记放在~/Documents/notes下按主题或类型分子目录。例如计算机安全课程的笔记放在~/Documents/notes/school/cs136。不同笔记之间用标准 Markdown 链接语法互相引用例如Computer Science。这种根目录 分类子目录 内部互相链接的组织方式恰好对应 Markor 中的Notebook概念。仓库 README 的 FAQ 解释Notebook 就是文件的根目录Markor 启动时主界面就停留在该目录允许你浏览文件根目录位置可自由更换。因此你完全可以把桌面端的~/Documents/notes直接设为 Markor 的 Notebook 目录两侧看到的目录树就是同一个。3.2index.md整个知识库的首页为了让大量笔记有一个家作者维护了一个index.md。完整内容如下注意其中使用了 YAML front matter 声明标题与副标题--- title: My Knowledge Base subtitle: This is a collection of things that I know, things that I learn, and things that I want to remember. --- ## School - Computer Science - Math - Physics ## Technologies Tips and tricks on different applications and technologies that Ive found myself needing to look up more than once. #### Languages - Go - Python #### Tools - Postgres - MySQL - SSH - Git #### Other - Linux Audio - Progressive Web Apps - Machine Learning ## Misc - Favorite Film Moments - [Recipes](https://link.gitcode.com/i/8ebbe22f8f16ee11f76363b788b90855) - Project Ideas - Blog Post Ideas - Music to Listen To - [Book Notes](https://link.gitcode.com/i/8ebbe22f8f16ee11f76363b788b90855) - [People](https://link.gitcode.com/i/8ebbe22f8f16ee11f76363b788b90855) - Quotes I Like这份文件的三个价值点导航中枢链接到所有笔记分类是阅读时的home base网站首页将笔记转成静态网站后它就是现成的主页可被解析的元数据文件头的 YAML front matter 对 Markor 同样有效——见下文源码解析中MarkdownTextConverter对 front matter 的处理。值得一提的是这套索引页 子页面互相链接的思路与 Markor 生态中的 Vimwiki/Zim 工作流完全同源仓库里收录的另一篇姊妹文章 《Synced plaintext TODO and notes (Vim / Vimwiki, Markor Android, Syncthing, GTD)》 就演示了同一套体系与 todo.txt 任务管理的结合。四、四种查看笔记的方式作者配置了多种阅读入口分别应对快速查阅与大考前复习两类场景。4.1 在 Vim 里Vimwiki 的链接导航Vimwiki 让在大量 Markdown 笔记间穿梭变得极其容易。作者把光标放在链接上按 Enter 即可跳转到对应笔记——他只使用了 Vimwiki 这一个核心特性导航这一点在文末局限一节还会再讨论。4.2 在浏览器里pandoc Makefile rsync对于零散查阅作者最常用的其实是浏览器。他用一个 Makefile 把全部 Markdown 笔记批量转成 HTML再通过 rsync 部署到服务器置于 HTTP 认证之后。Makefile 大致如下缩进已规范为 Makefile 所需的 TabMD_FILES$(shell find . -name \*.md) HTML_FILES$(MD_FILES:.md.html) BUILD_HTML_FILES$(HTML_FILES:%build/%) all: $(BUILD_HTML_FILES) build/assets/%: assets/% mkdir -p $$(dirname $) cp $? $ build/%.html: %.md template.html mkdir -p $$(dirname $) pandoc -o $ --templatetemplate.html $ deploy: rsync --recursive --human-readable --delete --infoprogress2 \ build/* my_server拆解各条规则的作用MD_FILES用find递归收集所有.md文件作为输入集合BUILD_HTML_FILES把输入文件路径映射到build/目录下对应的.html输出build/assets/%把图片等静态资源复制进构建目录保证页面引用不失效build/%.html核心转换规则pandoc -o $ --templatetemplate.html $表示以template.html为模板把源 Markdown 转为 HTMLdeploy用rsync增量、可读进度地把build/内容同步到远程服务器--delete会清理远端多余文件。作者目前是在笔记改动后手动执行部署未来计划将其自动化。Markor 侧的对应能力桌面端用 pandoc 渲染手机端则由 Markor 内置转换器负责。README 将其列为核心特性之一——Convert, preview, and share documents as HTML and PDF将文档转换、预览并分享为 HTML 与 PDF。换句话说同一份 Markdown 文件在桌面上交给 pandoc在手机上交给 Markor二者产出同构的 HTML/PDF。4.3 在手机上Syncthing Markor作者用Syncthing在电脑与手机之间同步笔记目录用Markor在手机上管理与编辑。他评价 Markor 的优点浏览笔记目录很方便内置编辑器对 Markdown 有良好的格式化显示。关于同步README 的 FAQ 给出了重要前提Markor 是并且将一直是一款离线优先的应用同步工作由外部同步客户端完成已知可配合的同步客户端包括 BitTorrent Sync、Dropbox、FolderSync、OwnCloud、NextCloud、Seafile、Syncthing、Syncopoli 等项目官方推荐 Syncthing并配有专门的配置指南 《Markor: How to synchronize files with Syncthing》。这一离线优先 外部同步的设计恰好与本文工作流中Syncthing 负责搬运、Markor 负责读写的分工严丝合缝。4.4 打印pandoc 生成 PDF Ghostscript 合并大考前作者会为具体课程生成一份合并 PDF 用于复习。以下是软件工程课程的 Makefile 示例MD_FILESabout.md 130-final-notes.md general-advice.md requirements.md \ software-processes.md modeling.md architectural-design.md \ design-of-components.md software-quality.md \ configuration-management.md testing.md week-2-discussion.md \ week-3-discussion.md week-4-discussion.md PDF_FILES$(MD_FILES:.md.pdf) BUILD_PDF_FILES$(PDF_FILES:%build/%) EXTRA_PDFSsample-midterm-solutions.pdf 130.pdf: $(BUILD_PDF_FILES) gs -sDEVICEpdfwrite -dCompatibilityLevel1.4 -dPDFSETTINGS/default \ -dNOPAUSE -dQUIET -dBATCH -dDetectDuplicateImages \ -dCompressFontstrue -r150 -sOutputFile$ $^ $(EXTRA_PDFS) build/%.pdf: %.md mkdir -p $$(dirname $) pandoc -V geometry:margin1in -o $ $?这条流水线分两步build/%.pdf规则对每个.md调用pandoc -V geometry:margin1in -o $ $?把单篇笔记转成带 1 英寸页边距的 PDF130.pdf目标把所有生成的 PDF 交给Ghostscriptgs合并成一份总 PDF。其中$^是全部依赖即所有build/*.pdf$(EXTRA_PDFS)是额外附加的 PDF如样例期中考试解答。作者特别提到对开卷考试极其好用——因为他可以把自己允许携带的所有资料提前合并成一份。五、源码级解析Markor 如何支撑这套工作流以上是原文的完整实操内容。下面结合 Markor 仓库源码看看手机端这一环在底层是如何实现的。5.1 Markdown 渲染flexmark-java 与扩展体系Markor 的 Markdown 转换核心在 MarkdownTextConverter.java。它基于 flexmark-java 构建解析器与渲染器见 L126-L149启用了一大组扩展表格TablesExtension、任务列表TaskListExtension、删除线StrikethroughSubscriptExtension自动链接AutolinkExtension、Wiki 链接WikiLinkExtension目录TocExtension/SimTocExtension数学公式FlexmarkKatexExtension即 KaTeXYAML front matterYamlFrontMatterExtension、Jekyll front matter 与标签JekyllFrontMatterExtension/JekyllTagExtension脚注、emoji、GitLab 风格语法、Admonition提示块等。对笔记场景特别有用的两个细节链接中的空格options.set(Parser.SPACE_IN_LINK_URLS, true)允许this这类含空格的链接写法L169并在渲染前自动把空格转成%20——与原文用标准 Markdown 链接语法互链笔记的用法完全兼容任务列表的勾选状态任务列表项被渲染成可勾选的 checkboxL179-L181适合度假打包清单这类临时勾选场景。5.2 YAML front matter 与目录TOC的自动处理原文index.md开头用了 YAML front matter这在 Markor 中不是死文本转换器会解析 front matterL216-L241并把允许展示的键渲染成结构化信息块如果笔记位于_posts、blog、post这类博客目录或用户在设置中开启目录功能Markor 还会**自动生成目录TOC**并插入到文档顶部L243-L267。姊妹文章 Pitt 的 Vimwiki/Markor 笔记 中展示的自动生成的目录正源于此。此外转换器还支持数学公式检测到$时按设置注入 KaTeX 资源L269-L277、代码块语法高亮检测到时启用 prism以及 Mermaid 图表渲染——这些能力让课堂笔记、读书笔记、项目文档都能在手机端获得体面预览。5.3 语法高亮与测试保障Markor 的编辑器端通过 MarkdownSyntaxHighlighter.java 实现 Markdown 语法高亮其中定义了标题、链接、无序列表、有序列表、引用、删除线、代码块等正则模式L22-L32。这些模式不是拍脑袋写的而是有配套测试兜底例如 MarkdownHighlighterPatternTest.java 以输入文本 期望命中次数的形式验证了标题、链接、删除线、代码等模式的边界行为比如# Hi与#Hi的差异、####### Hi超出六级标题不命中、链接括号不匹配不命中等另有多个针对加粗、斜体、列表的专项测试见 app/src/test/java/net/gsantner/markor/format/markdown/。这意味着你在手机上编辑的 Markdown其高亮行为是有明确规格约束的。5.4 离线优先与同步工具天然兼容整套工作流的移动端立足点是文件在本地README 的隐私章节明确说明 Markor 默认不联网除非笔记内容本身引用了外部 URL 资源文件默认存储在用户可选的本机目录默认是内部存储的 Documents 目录。正因如此Syncthing 这类外部同步工具才能在后台把~/Documents/notes的改动搬到手机上——Markor 只负责读写本地文件同步完全由 Syncthing 负责两者互不干扰。六、这套系统的局限与改进空间作者直言这套系统很好但并非完美并指出两点过度优化的陷阱他很享受调整 Vim 配置和笔记流程但优化常常花掉的时间比省下的还多——比如为了修正拼写错误词的语法高亮颜色或纠结生成 PDF 中标题的字体大小结果错过整段课堂内容。这一点对任何追求工具完美主义的人都适用工具链稳定后应把精力放回笔记内容本身。Vimwiki 使用深度不足Vimwiki 功能强大但他只用了跳转到链接文档这一项因此要么换一个更精简的、只包含该功能的插件要么开始用足 Vimwiki 的更多特性。从仓库生态看第二条路有现成参考——姊妹文章演示的 Vimwiki 与 todo.txt/GTD 组合doc/2020-09-26-vimwiki-sync-plaintext-to-do-and-notes-todotxt-markdown.md就是 Vimwiki 能力的进一步挖掘。七、小结从零复现这套系统最后把整条工作流浓缩为可执行的清单建目录在电脑上创建~/Documents/notes按学科/类型建子目录写索引创建index.md按文中的结构维护分类链接可带 YAML front matterMarkor 与 pandoc 都能识别桌面编辑Vim Vimwiki利用 Enter 键在笔记链接间跳转手机接入安装 Markor把 Notebook 根目录指向同步中的同一目录手机即可浏览、编辑、渲染同一批.md文件同步用 Syncthing 双向同步笔记本目录配置细节可参考 仓库内 Syncthing 指南导出照抄文中的两份 Makefile——一份用 pandoc rsync 把笔记发布成带密码保护的静态网站另一份用 pandoc Ghostscript 把课程笔记合并成复习用 PDF约束自己把优化工具链的时间预算设好把剩余精力留给笔记内容本身。这套系统的本质是把笔记还原为普通的纯文本文件从而让编辑、同步、渲染、归档各自交给最擅长的工具。Vim 负责高效输入Syncthing 负责搬运pandoc 负责输出而 Markor 则把同一批文件在 Android 端重新激活——这正是 Markor 项目与任何平台上任何纯文本软件互操作的设计初衷。赞分享移动开发【免费下载链接】markorText editor - Notes ToDo (for Android) - Markdown, todo.txt, plaintext, math, ..项目地址https://gitcode.com/gh_mirrors/ma/markor点击查看免费下载相关推荐Markor 纯文本同步笔记与 GTD 任务管理实践Vim todo.txt Markdown Syncthing 全流程指南Markor 纯文本同步笔记与 GTD 任务管理实践Vim todo.txt Markdown Syncthing 全流程指南 本指南以 Mark移动开发Markor 功能全解Android 上的 Markdown 笔记与 todo.txt 纯文本编辑器Markor 功能全解Android 上的 Markdown 笔记与 todo.txt 纯文本编辑器 导读 Markor 是一款面向 Android 的纯文本移动开发CKEditor 5 Decoupled Editor 完全指南自由定制文档编辑器 UI 布局与集成实战CKEditor 5 Decoupled Editor 完全指南自由定制文档编辑器 UI 布局与集成实战 导读 Decoupled分离式编辑器是 CKEd移动开发上一篇DLSS Swapper实用指南游戏版本管理完整教程下一篇终极完整指南DLSS Swapper版本管理神器快速上手创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表