All Articles

如何管理个人笔记

1. 笔记分类

笔记管理是非常重要的,无论是小时候老生常谈的剪报修养,到读书学习时候的课堂笔记,再到后来的个人博客,无非就是将经验积累下来,转化为文字形态进行存储。无论其子概念范畴是什么,其实一律可以归类为「笔记」。

这里简单分享下个人的笔记分类,主要以可见度为第一维度分类,以内容和类型为第二维度分类(不存在微博、twitter之类的短文字内容,这类内容不足以被称为笔记):

  • 公众可见:

    • 个人博客:进行一些经验分享和探讨(comment形式),以技术内容为主,辅以少量政经评论
  • 个人私密:

    • 剪藏笔记:主要是通过剪藏的方式进行存储的一些资料,包括技术内容的以及政经内容的各种方向资料
    • 日记
    • 个人感悟:日常的一些体悟和思想积累,也包括游记等娱乐内容

其负责的领域各不相同:

  • 个人博客主要进行技术分享,其实本来也有政经探讨的意向,但因为国情问题,还是不方便在公众场合进行这类分享
  • 剪藏笔记属于非常重要的一块,不过这块基本上都不是原创内容,是从网络各个频道上剪藏过来的内容,和老旧概念剪报属于一个意思。这部分内容最主要是构建个人知识数据库,需要高效的工具进行管理,方便后续的搜索和查询
  • 个人感悟这块纯原创,主要把人生中的各种想法和经历记录下来,以免一辈子白活

2. 工具选择

根据上面的分类,工具主要分3部分:

  • 个人博客:

    • 静态博客系统,使用github来进行host
    • 至于静态博客系统选哪家,那实在可选的工具太多了,大家根据自己的技术栈来进行选择即可
    • 目前我个人刚从jekyll转到gatsby,后面应该也会撰文记录细节
  • 剪藏笔记:

    • 目前市面上的选择应该也比较多了,这块推荐印象笔记以及剪藏插件,再加上印象笔记官方微信公众号的剪藏功能,可以保证全平台覆盖
    • 印象笔记的tagging和搜索功能都做的很强大,非常好用
  • 个人感悟:

    • 之前使用的是dayone,目前转到了obsidian使用静态文件系统进行管理
    • 这块属于本文的重点内容后面细说

阮一峰的博文「最适合程序员的笔记软件」,可以仔细阅读下。

3. 备份和安全

无论上述的任何一个分类,数据安全都是非常重要的,当然需要有针对性的对策:

  • 个人博客:之前也提到了使用静态博客系统,既然如此这块自然会使用git进行代码/内容管理,git本身就是分布式的,remote一份,本地磁盘一份,OSX的TimeMachine一份
  • 剪藏笔记:这块主要靠印象笔记的云服务,云端一份,本地磁盘一份,OSX的TimeMachine一份
  • 个人感悟:目前使用obsidian,iCloud一份,本地磁盘一份,OSX的TimeMachine一份

4. DayOne的问题

使用DayOne的时间也很久了,这款软件的版本演进引入了相当激进的行为变化,导致了一系列的问题。

早期程序行为:

  • markdown优先,编辑操作非常轻松愉快
  • 数据存储完全依赖文件系统,每个post一个单独的文件,附件则全部存储到一个统一的文件夹内

这就保证了:

  • 程序员型的编辑者创造内容有非常愉悦的编写体验
  • 内容所见即所得,不需要手动操作菜单界面
  • 备份非常简单便捷,直接存放到备份文件系统即可
  • 后续切换到其他的编辑软件非常方便,只要是支持markdown语法的编辑软件都可以直接使用,如果不考虑过于复杂的内容维护和搜索等
  • 数据同步和备份的选择相当灵活,可以用iCloud也可以用dropbox等,反正数据就是文件而已

而后续程序改版为:

  • 编辑以界面菜单操作为优先,虽然仍旧兼容部分markdown语法,但大幅阉割,完整的编写体验需要大量的UI操作
  • 数据存储使用数据库sqlite,不再使用文件系统
  • dayone推出了自己的同步云服务,等于是变相把软件做成了订阅型软件,希望多端数据同步的必须买dayone自己的服务,不再可以使用第三方的iCloud之类的
  • 限制单个post最多30张图片
  • 单个图片文件分辨率上限为4K,大于4K则会被压到4K

导致了:

  • 编辑体验非常难受,有种回到了被word支配的年代的感觉
  • 备份比较麻烦,内容不够直观
  • 因为引入了数据库的原因,很多数据的关系就不再直白了,必须理解数据库表和数据的关系才能掌握

    • post和tag的关系,哪篇post有多少tag
    • post和附件的关系,哪篇post有多少图片,图片在哪
  • 这样的改版也造成后续软件切换有非常高的难度,因为不再是文件形式的数据保存,后续如果要换成其他软件,必须制作工具从数据库中导出数据才行
  • 数据同步和数据安全都不再可选,且dayone的云服务早期非常不稳定
  • 图片数量限制让人非常不愉快,特别是在做游记的时候

所以自dayone改版之后,一直有意向且在留意是否有比较好的工具可以转过去。

5. 个人感悟的工具选择

个人博客使用静态博客系统,剪藏笔记使用印象笔记,这个基本上不太需要动。但人生感悟这块数据太敏感了,而且太重要了,切不能随便交给一家厂商就完事了,一定要思考数据如何保证安全,如何保证在这家厂商服务关闭之后能简便切换到其他软件,阅读和编辑的连贯性。因此这块的工具选择有几点要求:

  • 以markdown为优先的编写体验
  • 以文件系统作为数据存储的方式
  • 可以有一定的高级数据关系支持:分类、tagging、搜索
  • 可以灵活切换到其他编辑软件
  • 可以进行便利的备份

目前看下来只有obsidian能完全满足上述需求。

6. Obsidian

6.1 Obsidian简介

官方主页直接提供Desktop app的下载链接,也可以通过App Store安装。Mobile版本的下载在这里

个人使用的是iPhone,所以使用对应的iOS app。这里推荐先下载iPhone app,然后使用mobile app在iCloud里创建Vault。如果反过来先使用Desktop app来创建Vault的话,在iCloud里会和mobile app存放在不同的位置,导致双端同步不一致。

该软件的app都是免费的,直接可以下载使用,而且完全没有广告:官方Pricing页面。个人用户是完全免费使用的。

其他有用的链接:

obsidian的优点:

  • 完全免费,和FSNotes这种号称免费但在mobile市场收费的货色不同,是真的免费
  • markdown优先的编辑模式,编辑/预览完全分离
  • 纯文件模式进行数据管理,可以把它理解为一款代码编辑IDE,以纯文件夹形式管理posts

  • 拥有插件机制,可以发挥社区能量,进行功能的丰富化
  • 对一些批量操作支持非常优秀:

    • post重命名可以同步修改Vault中所有post内对应的内链地址
    • tag重命名也能同步修改Vault中所有post内对应的文本(需上面提到的插件支持)
  • 搜索查询功能非常强大,可以做到从海量数据中找到需要查找的posts

当然obsidian也有缺点和问题,目前来看最大的问题是这款软件更偏向桌面,对mobile的支持较一般,特别是第三方插件,很多都是只针对桌面版进行了研发(上面提到的gallery插件就是)。

至少目前看来,这款软件是完全能满足我的需求的,甚至大大超出了我的预期。

6.3 Obsidian设置及使用

下面会简单介绍下如何设置及使用Obsidian,以桌面版为视角,之前也提到了mobile版本仍旧只是能用。

创建iCloud内Vault

之前也提到了,需要先使用Mobile app,按软件界面的要求设置Vault即可。这里需要记住创建出来的Vault文件夹的名字。

定位MAC上的文件夹位置

MAC上的数据是通过iCloud进行同步的,根据OS版本不同,位置可能会变动。目前我的OS是:

11.5.2

数据位置在:

$ pwd
/Users/Jonathan/Library/Mobile Documents/iCloud~md~obsidian/Documents
$ ll
total 0
[email protected]  5 Jonathan  staff   160B  8 30 16:14 ./
drwxr-xr-x   4 Jonathan  staff   128B  8 26 15:22 ../
[email protected]  2 Jonathan  staff    64B  8 28 19:51 .Trash/
[email protected] 10 Jonathan  staff   320B  8 27 21:54 .obsidian/
[email protected]  5 Jonathan  staff   160B  8 30 16:14 Notes/
$ cd ./.obsidian
$ ll
total 48
[email protected] 10 Jonathan  staff   320B  8 27 21:54 ./
[email protected]  5 Jonathan  staff   160B  8 30 16:14 ../
[email protected]  1 Jonathan  staff   281B  8 30 16:29 app.json
[email protected]  1 Jonathan  staff   102B  8 30 16:29 appearance.json
[email protected]  1 Jonathan  staff    42B  8 30 16:29 community-plugins.json
[email protected]  1 Jonathan  staff   249B  8 30 16:29 core-plugins.json
[email protected]  1 Jonathan  staff   837B  8 26 19:37 hotkeys.json
[email protected]  4 Jonathan  staff   128B  8 27 14:59 plugins/
[email protected]  3 Jonathan  staff    96B  8 26 16:30 themes/
[email protected]  1 Jonathan  staff   2.7K  8 30 16:29 workspace

这里我创建出来的Vault文件夹名字是Notes,可以看到在刚才的ll中存在。而Obsidian自己的数据(含配置、插件、主题等)则存放在.obsidian文件夹下,它是一个Vault一个专属的文件夹的,不存在global的设置。在有多个Vault需要共享同一份设置的时候会有点麻烦。

打开MAC上的Vault

打开MAC版的Obsidian,然后按界面上的按钮指引打开刚才提到的iCloud文件夹即可(到Documents那层)。

软件设置

点击界面最左下角的Settings按钮,打开设置界面。后续的设置按界面操作即可,这里把完成的设置内容作为json代码贴在这里。注意插件需要手动到第三方插件 > 社区插件浏览安装,搜索关键字为:gallerytag

app.json

{
  "showFrontmatter": true,
  "defaultViewMode": "preview",
  "showLineNumber": true,
  "useTab": false,
  "emacsyKeys": false,
  "newLinkFormat": "shortest",
  "alwaysUpdateLinks": true,
  "useMarkdownLinks": false,
  "attachmentFolderPath": "./",
  "readableLineLength": false
}

appearance.json

{
  "baseFontSize": 16,
  "theme": "obsidian",
  "translucency": true,
  "cssTheme": "Obsidian Nord"
}

community-plugins.json

[
  "obsidian-gallery",
  "tag-wrangler"
]

core-plugins.json

[
  "file-explorer",
  "global-search",
  "switcher",
  "graph",
  "backlink",
  "tag-pane",
  "page-preview",
  "note-composer",
  "command-palette",
  "markdown-importer",
  "outline",
  "word-count",
  "open-with-default-app",
  "file-recovery"
]

hotkeys.json

{
  "app:go-forward": [
    {
      "modifiers": [
        "Ctrl"
      ],
      "key": "Tab"
    }
  ],
  "app:go-back": [
    {
      "modifiers": [
        "Ctrl",
        "Shift"
      ],
      "key": "Tab"
    }
  ],
  "workspace:edit-file-title": [
    {
      "modifiers": [
        "Mod",
        "Shift"
      ],
      "key": "R"
    }
  ],
  "tag-pane:open": [
    {
      "modifiers": [
        "Mod",
        "Shift"
      ],
      "key": "T"
    }
  ],
  "outline:open-for-current": [
    {
      "modifiers": [
        "Mod",
        "Shift"
      ],
      "key": "O"
    }
  ],
  "workspace:export-pdf": [
    {
      "modifiers": [
        "Mod",
        "Shift"
      ],
      "key": "P"
    }
  ],
  "workspace:copy-url": [
    {
      "modifiers": [
        "Mod",
        "Shift"
      ],
      "key": "U"
    }
  ]
}

快捷键主要就几个:

  • 打开设置:CMD + ,
  • 编辑文件名:CMD + SHIFT + R
  • 显示TAG面板:CMD + SHIFT + T
  • 打开文件大纲:CMD + SHIFT + O
  • 导出为PDF:CMD + SHIFT + P
  • 前进:CTRL + TAB
  • 后退:CTRL + SHIFT + TAB ,这两者保持和浏览器等的操作一致
  • 复制Obsidian内部URL:CMD + SHIFT + U
  • 切换编辑/预览模式:CMD + E
  • 在所有文件中搜索:CMD + SHIFT + F
  • 在当前文件中搜索:CMD + F
  • 在当前文件中搜索并替换:CMD + OPT + F

使用

使用上和一般的MD编辑器没什么差别,使用CMD + E来切换编辑和预览模式。就几点需要注意下:

  • 文件名不要直接在软件外重命名,而是一定要使用Obsidian来重命名,这样才能全部更新Vault内其他文件内对应的内链位置
  • 同样的,重命名tag也一定要使用软件的插件功能来做
  • 在文件的任何位置编写#TAG_NAME的文本,即可创建TAG_NAMEtag
  • gallery的配置使用如下

    • type:grid | active-thumb,一般使用grid,active-thumb为可拖拽的grid但有bug
    • path:存放会展示在gallery里的图片的路径
    • imgWidth:grid内每个图片格的宽度,一般不要太大
    • divWidth:%值,指grid所处的div占页面的宽度多少
    • divAlign:left | right,指grid所处的div在页面的左侧还是右侧
    • reverseOrder:true | false,是否逆转图片的展示顺序
    • customList:自定义的图片展示顺序:customList=5 10 2 4

e.g

6.4 Vault规划及front matter定义

Vault

由于Obsidian仅只是一款简单的编辑软件,和dayone这样使用数据库来管理数据的软件不同,它是不会对数据的存放位置和结构进行定义的,所有的一切都交由使用者自己组织。这就对使用者提出了要求,你不能随随便便把所有的内容全部都扔到Vault的根目录下,这会导致后续浏览及搜索的困难,也不能把所有的内容都分得过细或扔到过多层的子文件夹中,这也会导致浏览的障碍。

因此个人使用下面的格式来管理Vault:

iCloud Documents /
                 | .obsidian
                 | Notes /
                         | ...
                         | 2019 / ...
                         | 2020 / ...
                         | 2021 /
                                | ...
                                | 08 /
                                     | 20210828-obsidian-instruction /
                                                                     | assets / ... / *.jpg
                                                                     | obsidian-instruction.md

格式:Notes / YYYY / MM / YYYYMMDD-slug / slug.md | assets

Tag

posts文件都是分布在年月日的多层子文件夹下,因此直接通过文件系统进行浏览是非常困难的。这就要求尽量要做好post的tag内容管理,尽量分门别类做细,后面才可以通过tag的方式来进行post的快速浏览和查找。

e.g

#Tech #JavaScript
#Entertainment #Travel

个人Tag principles如下:

  • 每个post都一定要有category定义,因为obsidian本身没有category功能,所以可以把category作为tag放到post里,方便后续搜索,e.g

    • #Tech
    • #Entertainment
    • #Diary
  • 每个post都一定要有3个维度的时间信息,e.g

    • 年 #Y2021
    • 月 #M202108 #M08
    • 日 #D20210828 #D0828
    • 因为obsidian规定tag必须以字母起始,所以必须加一个字符

其他的tag就可以按post本身内容自行定义即可。

Front matter

Obsidian本身对front matter基本上是完全不支持的,不解析其中的内容。但建议仍旧还是要做好front-matter的管理,录入一些原始数据,以便后续有新的plugin支持的时候,可以快速调整来生效。

个人使用如下的front matter内容:

uuid: "..."
path: "/2021/08/20210828-obsidian-instruction"
date: "2021-08-28"
slug: "obsidian-instruction"
title: "obsidian使用教程"
location:
  altitude: 1
  latitude: 38
  longitude: 128
  address: "南京东路XXX"
  placename: "XXX国际大酒店"
  district: "黄浦区"
  city: "上海市"
  province: "上海"
  country: "中国"
weather:
  temperature: 31
  humidity: 78
  weather: "晴"
  aqi: 56

6.5 一些工具

  • agreatfool/dayone2md:将dayone的数据全部导出成上述文件夹格式md文件的命令行工具
  • agreatfool/obsidian-utils:帮助创建obsidian post的命令行工具,可以帮忙初始化title、tags、front-matter等信息

EOF