对于外界来说,硅谷最引人注目的元素之一就是生产力文化。在大多数地方,大多数人满足于按部就班地完成工作,而硅谷的人们则不然,他们如果不优化每一个习惯和系统,以在单位时间内榨取那一点额外的生产力,就无法找到内心的平静。我就是这些人中的一员,这篇文章讲述了我如何通过从 Neovim org-mode 切换到 Obsidian 来彻底改变我的生产力。
我会尝试解释我做出这一转变的原因,以免听起来完全疯狂。如果你想直接了解我的设置,请点击这里。
Org-mode,但在 Neovim 中
过去一年,我一直在使用 `nvim-orgmode` 插件来组织我的学业、日常待办事项和笔记,所有内容都存放在一个仓库中,并备份到 iCloud 和定期同步到 GitHub。
├── Archive
│ ├── Fall2021
│ ├── Fall2022
│ ├── Fall2022.org
│ ├── Spring2022
│ ├── Spring2023
│ ├── Summer2022
│ ├── Winter2022
│ ├── Winter2023
│ └── Winter2023.org
├── CSE101
│ └── ...
├── CSE141
│ └── ...
├── CSE141L
│ └── ...
├── PHYS2D
│ └── ...
├── books.org
├── inbox.org
├── misc
│ └── ...
├── notes
│ └── ...
├── personal.org
├── projects.org
└── school.org
/org 的文件结构。每门课程的相关笔记、材料和待办事项文件都存放在单独的目录下。
inbox.org
存储了日常的待办事项。
除此之外,我还在 iPhone 上使用了 beorg 应用,它通过 iCloud 从同一个文件夹中拉取数据。这种方式效果非常好:我所有的数据都集中在一个地方,以纯文本形式存储,并且可以从移动设备和桌面访问。如果你像我一样是 Vim 的忠实用户,那么永远不用离开终端的想法非常吸引人。
永不离开Vim的问题
我选择离开org-mode的根本原因很简单,与markdown相比,org
文件格式在撰写散文方面显得逊色。它充满符号的语法无法与markdown的简洁和可读性相媲美。此外,它也没有像markdown那样广泛的工具支持,后者在互联网上无处不在。因此,我发现自己完全不再使用org
文件做笔记,使得笔记与任务集中一处的提议形同虚设。
于是,我不得不为我的vim配置添加工具,以使markdown编辑更加友好。vim-pencil
自动换行,赋予Vim类似Google Docs的体验。接着,我编写了pandoc.nvim
,用于在保存时自动将markdown文件渲染为PDF。我还不得不编写imagepaste.nvim
,以便能够通过cmd-V
将图片粘贴到markdown文件中。最终,我有了一个可用的配置。然而,vim-pencil存在bug,且为了查看markdown而打开PDF阅读器也颇为烦人。
深陷对Vim的迷恋之中,我花了些时间才意识到,尽管Vim在代码编辑方面表现出色,但它并非为散文类内容而设计。这包括笔记。其以思维速度编辑的口号似乎并不适用于笔记。
就在那时,我发现了Obsidian。通过安装几个插件,它变得像Vim一样完全可编程,而且恰好是专为笔记记录而构建的。
Obsidian
以下是我经过一个月刻意使用后的当前配置概览。我尽量保持其快速且尽可能易于管理。
主题
我使用的是 Minimal 主题,它附带多种配色方案,你可以通过 Minimal 主题设置插件进行选择。
我使用的是 Gruvbox 配色方案。
插件
我的大部分设置都围绕着我的每日笔记展开,我将其用作一种主页,包含我的目标、待办事项和日程安排。
你可以通过在 Obsidian 设置 社区插件 浏览中搜索其名称来找到这些插件。
#### 周期性笔记
这为你提供了一个命令来打开每日笔记,并在创建笔记时应用一个模板。我的设置如下:
这意味着它会将 templates/daily.md
复制并执行到 daily_notes/YYYY-MM-DD.md
中,并使用今天的日期进行格式化。
模板引擎
这是我设置中的精髓所在。它允许你执行几乎任意的Javascript代码,并将结果插入到每日笔记文件中。
确保开启此设置
任务
这是替代 org-mode 的 TODO 功能的方案。为了与 Dataview 兼容,请按如下方式设置。
Dataview
Obsidian 中最受欢迎且实用的插件之一,它将你的知识库转化为可查询的数据库。我主要用它来管理任务,但你可以在其文档中找到更多丰富的用途。
日历
这仅仅是为了方便,但它会在侧边栏中插入一个简洁的日历。你可以点击任意一天,它会带你跳转到当天的笔记。
#### 每日计划器
它会查看当前笔记中的Markdown内容,例如:
- [ ] 08:00 起床
- [ ] 12:00 吃午餐
并在侧边栏显示一个日历,如下所示:
我的每日笔记模板
我在<!--- -->
形式的注释中添加了说明,解释每个部分。
# 早安
<!---
我有一份每日待办清单,帮助我醒来时感到有所成就
-->
- [ ] 整理床铺,龙虾
- [ ] 做20个俯卧撑
- [ ] 煮一杯咖啡
# 今日目标
<!---
使用3-3-3方法,这对我很有效
-->
### 今日重点
> 我今天的主要目标是什么?如果我完成了这个目标,今天就是成功的。
-
### 轻松任务
> 哪些任务*不需要*深度工作?
-
### 维护任务
> 我需要做些什么来为第二天做好准备?清理?查看邮件?
-
# 任务
<!---
以下查询中用于存储今天和明天的代码,格式为YYYY-MM-DD。
-->
<%*
const today = `"${tp.file.title}"`;
const _tomorrow = moment(tp.file.title).add(1, 'days').format("YYYY-MM-DD")
const tomorrow = `"${_tomorrow}"`;
-%>
## 逾期任务
<!---
对所有截止日期/计划日期已过的任务运行查询。
-->
```dataview
TASK WHERE
!completed AND ((due AND due < date(<%today%>)) OR (scheduled AND scheduled < date(<%today%>)))
SORT min(due, scheduled) ASC
```
## 今日
<!---
运行一个查询,找出所有截止日期/计划日期为今天的任务。
-->
```dataview
TASK
WHERE scheduled = date("<%tp.file.title%>") OR due = date("<%tp.file.title%>")
```
## 未来 10 天
<!---
查询所有任务,其中截止日期/计划日期在未来 10 天内。
-->
```dataviewjs
dv.taskList(
dv.pages().file.tasks.where((t) => {
// 任务未完成
// 截止或计划在 N 天内
const N = 10;
if (t.completed) {
return false;
}
if (!t.due && !t.scheduled) {
return false;
}
let relDate;
if (!t.due || !t.scheduled) {
relDate = t.due || t.scheduled;
} else {
relDate = t.due < t.scheduled ? t.due : t.scheduled;
}
const diff = relDate - (new Date(<%today%>));
const dayDiff = diff / (1000 * 60 * 60 * 24);
return dayDiff <= N;
}),
);
```
# 计划器
<!---
如果笔记的日期与今天的日期匹配,则将当前笔记设置为由 Day Planner 读取的笔记。
警告:使用了非官方 API,因此以后可能会失效。
--->
<%*
if (tp.date.now("YYYY-MM-DD") == tp.file.title) {
try {
app.commands.commands["obsidian-day-planner:app:unlink-day-planner-from-note"].callback();
} catch (e) {}
app.commands.commands["obsidian-day-planner:app:link-day-planner-to-note"].callback();
}
-%>
<!---
每日计划器的时间,这样我就不必每天手动输入了。
--->
- [ ] 08:00
- [ ] 09:00
- [ ] 10:00
- [ ] 11:00
- [ ] 12:00
- [ ] 13:00
- [ ] 14:00
- [ ] 15:00
- [ ] 16:00
- [ ] 17:00
- [ ] 18:00
- [ ] 19:00
- [ ] 20:00
- [ ] 21:00
## 今日笔记
<!---
一个查询所有文件的查询语句,用于选择今天修改过的笔记。
这让我可以轻松回顾今天处理过的笔记。
-->
```dataview
TABLE file.mtime as "修改时间", file.ctime as "创建时间"
WHERE file.mtime > date(<%today%>) AND file.mtime < date(<%tomorrow%>) AND file.day != date(<%today%>)
SORT file.mtime DESC
### 图库



### 其他好用的插件
#### Excalidraw
如果你还不熟悉这个绘图工具,那你应该了解一下。它是制作图表和草图的好方法。更棒的是,通过 Excalidraw 插件,它可以完全集成到 Obsidian 中!
注意:你还需要另一个名为 `Ozan's Image in Editor Plugin` 的插件,以便在其他笔记中查看这些绘图。
#### 高级表格
Markdown 最不友好的部分之一就是其表格语法。这使得通过自动格式化和电子表格公式处理表格变得更加友好。
#### 将URL粘贴到选中的文本中
选中文本,然后按下 `cmd-V`。文本现在会变成指向剪贴板中内容的链接!
#### 自然语言日期
我在任务中使用这个功能。
我输入的内容:
```markdown
- [ ] 一个任务 [计划 @今天]
```
我得到的结果:
```markdown
- [ ] 一个任务 [计划 :: 2023-09-14]
```
我使用这个设置来获取 `::`

#### Obsidian Git
该插件自动将我的知识库备份到 Git 仓库中。它复刻了我 org-mode 配置的功能,但更胜一筹!
#### Vimrc 支持
由于我在 Obsidian 中使用 Vim 键位绑定,这让我可以通过自定义 `.vimrc` 文件在一定程度上对其进行定制。
## 结论
总的来说,我很享受使用 Obsidian 的过程。而且,我发现离开终端处理某些任务并没有影响我的效率。听起来可能有些疯狂,但这是事实。如果你想开始使用 Obsidian,我建议不要去看那些与 Obsidian 笔记系统相关的 YouTube 视频。我发现它们更多是干扰而非帮助。只需按照你平时的方式记笔记,然后随着时间的推移逐步引入 Obsidian 的功能。
如果你对 Obsidian 或本文有任何想法、评论或建议,欢迎在下方留言!