Prefer note-taking app

Reading time ~1 minute

TLDR

先立结论,目前我发现的最适合我的笔记软件是 nb。 说 nb 一个是笔记软件并不完全准确,它更应该算是一个笔记管理工具,它提供了一种面向程序员记笔记的管理方式。

史记

最初开始养成写笔记的习惯是在 Evernote 刚刚兴起的时候,那个时候并没有太多的选择,云同步是我印象中 Evernote 的一个主要优势,但是输入体验一直都很一般,甚至都达不到现在的平均水平。所以后来我切换到了 Alternote 使用了很长一段时间,它是一个基于 Evernote 存储的三方笔记软件,输入体验比 Evernote 好多了,单独创建两个属于自己的私人手写笔记本,然后授权同步到 Alternote,体验不要太好。直到后来 Markdown 兴起,技术类的笔记越来越多,富文本编辑器根本满足不了需求,也找不到一个满意的笔记软件来实现。技术类笔记的出发点其实是 code snippet,所以几经试用我选择了 SnippetsLab,这个软件我用了至少四年。它本身只是一个管理 code snippet 并且能够快速检索并复制的工具,从最开始的 objc 和 bash,到后来的 python 和 markdown,堆积下来的内容越来越多,内容也越来越不像是 snippet,它内置的 markdown 编辑器已经不能满足我“笔记本”级别的要求,只能又开始找替代品。

2020年什么笔记软件最火?google 能搜出来一大堆,还有各种软件推荐平台的测评。简单可以分成两类:面向学生党的,这个方向的需求要求知识点的链接和修改比较强,首选 OneNote;面向普通办公类的,这个方向的需求就比较花哨了,各种从模板派生出来的个人笔记,简直就是要从根源上做出一个自带云平台的 Office 套件,花里胡哨的表格,Task List,Board 等等概念层出不强。这些都不是我想要的。同时因为我刚刚从 SnippetsLab 里面迁移出来的笔记需要再在新的笔记软件中导入,所以我希望最好能在 markdown 格式上有比较好的兼容,这一点要求就更高了。

Microsoft OneNote,先不考虑迁移的问题,冲着它的名气我试着在新笔记中尝试用它,效果不错。作为一个笔记软件,输入体验非常好,思路紧随其后是一件非常畅快的事情。直到我想画图,好家伙我以为这玩意儿能跟 Word 中的体验一样甚至更好,结果一下子把我泼醒了。尝试迁移出来,结果这个过程就更恐怖了,微软好像就没有想过用户会有想走的这种想法,富文本的导出让我非常痛苦,最终我只能把简单的几个笔记手动复制出来改格式。

Notion,这就是所谓万众瞩目的重新定义笔记了,第一印象它好像是 markdown,结果我马上就否定了这个结论。直到弃坑的时候我才醒悟原来所谓的重新定义居然是重新定义笔记格式,这样就可以美其名曰不考虑兼容问题了,确实厉害。第一次使用的学习成本还是有一点点的,不能上手就来,我需要在每行前面输入/之后再选一选我到底应该用什么标签,在使用了两周之后我还没有习惯这一点:当我的脑子里想好准备输入什么的时候,结果一上来它问我需要用什么标签,硬是要打断我一下,即使我知道默认第一个选项是 plain text。弃坑了,准备导出成 markdown,发现每一个文件中都有他们的私有标记!这不扔了还留着过年?

这几年类似这种主要面向企业办公,项目管理,文档在线编辑的平台越来越多,我不能太理解这是为什么,有竞争毕竟对用户是好的,但是好像各家平台的编辑好像并没有太大区别。有一点是肯定的,不是给个人用户特别是程序员准备的。如果我是一个普通用户的话,对于笔记存储,我更偏向于选好一个同步盘而不是这些一体化的笔记平台。

对于我个人,说说我目前理想中的笔记软件应该满足的几个条件吧。

满足条件

  • 输入体验

    这是最重要也是最优先的一条,每次我再尝试一个新的笔记软件或者编辑器的时候,输入体验作为第一印象的好坏直接影响了最终选择,而且很容易做出决定。 就这一点而言,Office 2019 就很好,很流畅,输入的过程让我觉得像流水一样舒服。 还有一些其他优秀的编辑器也能做到同等的效果,再次一个等级的就是系统原生级的输入体验,macOS 上的 TextEdit,Windows 上的 notepad,其实都不错,尤其是在现代新版系统上的体验。 最次的就是某些嵌套网页渲染框架的渣渣了,其实单论网页中的输入体验而言,并不是所有的场景都差,我印象中就有一两个便签类的 Chrome 插件就做得不错,有一些网站也会在输入通过脚本提高输入的体验的。至于剩下的大多数就都是狗屎了,尤其是基于 Electron 的跨平台解决方案。

    再骂一次:跨平台就是一坨狗屎。强行把多个平台的逻辑硬生生统一成的一个个怪胎,可能原本的目的是想让用户体验双飞的快感,但最终大都是在喂用户吃屎。

    说回笔记,跨平台和多平台是两回事,笔记的核心优先是输入,其次才是管理。如果不能直接掌控核心的输入逻辑的话,我觉得就可以不要去做了,省了挨骂。起码不能比系统内置的编辑器差吧。

  • 管理

    对笔记的管理本质是对文件的管理,这一点我最痛恨的是私有格式。很多笔记软件动不动就搞一套自己的私有格式来做标记,这种设计只方便了自身系统,完全不考虑用户迁移的成本(事实上他们也从来没有考虑过这一点,相信自己的用户会永远死在自己的平台里),始终相信自己未来会成为行业标杆。

    最臭名昭著的就是 notion,定义了一堆的私有标签,当我尝试导出成 markdown 的时候才发现,修改成通用格式这个过程非常痛苦。

    所以最理想的格式应该是主流开放的,markdown, RSTpanDoc 能支持互转的格式。笔记软件本身应该在保证不直接修改笔记内容本身通过既定通用格式已有的标记或者拓展的格式来管理元数据。这很困难,特别是在不把笔记本放在沙盒环境中的时候。因为很可能用户直接的软件系统之外直接修改了文件内容,所以笔记管理的职责还应该有自己的容错和纠错能力。

  • 导入导出

    最好的导入导出方式就是不用导入导出。在定义或者导入笔记本的时候就直接询问用户得到一个指定目录,接下来所有的笔记都直接存在对应笔记本目录下,包括拓展出来的元数据。

  • 搜索

    搜索是刚需,也是 GUI 笔记软件的主要优势之一。因为搜索很多时候需要经常调整过滤参数,所以修改过滤参数在 GUI 上操作会更方便。至于要不要建立内容索引,我觉得都可以,但是简单的模糊匹配还是要有的。

  • 同步

    同步自定义目录的内容现在在各个平台还是有很多方案,Dropbox, OneDrive, WebDav, git 等等都是很好的选择,这些专业的同步服务一般会比笔记平台自身做的更好,同时也更透明,方便诊断问题。

Git

2015年重装了一台 mac 工作机,我发现在没有 Time Machine 的情况下要把家里的软件都搬到一个工作机器上是一个很复杂的事情,所以从那个时候开始把我用到或者可能用到的软件清单写到一个笔记里面,后来又多了几个设备类型,于是改成了 git repo 存储托管在 Bitbucket 上,格式当然是纯文本的 Markdown,为了方便快速同步(我也想不到每次改点儿什么需要些什么 commit message)我还单独封装了一个 bash 脚本。要编辑的时候就打开我目前比较喜欢的 Typora 编辑器,这就是我用的最久的笔记管理方式了。最原始的也许就是最好的

nb

nb 没有编辑器的概念,默认是 vim,由用户来选择编辑器,比如 Typora,Macdown 等等。导入导出也是非常方便的,nb 不会在编辑笔记的前中后在笔记文件文件本身做任何私有改动,除了在笔记本内部生成 .index 的索引文件,所以可以认为导入导出是几乎没有任何代价的。关于搜索,nb 在目前的开发阶段还在摸索阶段,不过已经支持常用的搜索功能了,包括 and/or pattern。它的核心还是在管理笔记文件本身,基于 git 的同步封装。因为是命令触发式的操作,为了解决我偶尔可能忘了手动 nb sync -a 的情形,我写了一个简单的 launchd 定时任务,帮我每天定时跑两次同步到远端仓库。基于 nb 的操作还有很多,很多场景也给我留下了余地,我可能很久都不会换笔记平台了,但是不排除未来我会见异思迁换个别的编辑器!

选择笔记软件应该按照自己的习惯方式来定,不要盲目跟风,不要盲目跟风,不要盲目跟风。

小工具

顺便推荐两个小众工具:

pet,一个很轻便的命令行 snippet 工具,可以把日常的各种又复杂又长但并不是很好记命令存到一个本地的 toml 文件里,支持 github gists 同步,只有一个全局存储文件,不区分分类。

just,有些复杂的命令只是针对某个项目的,添加到全局的 pet 里面并不是很合适,这个时候可以考虑通过一个 justfile 把它们存起来,just 还不局限于当前 shell 的执行环境,还能利用当前系统中其他解释器,比如 python, ruby, swift 等等。推荐将 justfile 添加到项目的版本控制中。

DocFetcher,这是一个开源的GUI搜索工具,可以用来搜索指定的各类本地文件,自动创建索引。我把所有 nb 笔记本仓库的目录都添加了进去,发现它创建的索引文件并不是和对应的目录下面的,没用污染,很赞的一个轻量级工具。占用的系统资源极少,不过在 macOS 下有时候会无响应。

Updated on Will Han