• Org-mode,但在 Neovim 中
    • 永不离开Vim的问题
  • Obsidian
    • 主题
    • 插件
    • 我的每日笔记模板
  • 首页
  • 文章
  • 笔记
  • 书架
  • 作者
🇺🇸 en 🇫🇷 fr 🇮🇳 ml

Nathaniel Thomas

转向 Obsidian

2023年9月14日

对于外界来说,硅谷最引人注目的元素之一就是生产力文化。在大多数地方,大多数人满足于按部就班地完成工作,而硅谷的人们则不然,他们如果不优化每一个习惯和系统,以在单位时间内榨取那一点额外的生产力,就无法找到内心的平静。我就是这些人中的一员,这篇文章讲述了我如何通过从 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

### 图库

![](daily_note_top.png)
![](daily_note_tasks.png)
![](daily_note_planner.png)

### 其他好用的插件

#### Excalidraw

如果你还不熟悉这个绘图工具,那你应该了解一下。它是制作图表和草图的好方法。更棒的是,通过 Excalidraw 插件,它可以完全集成到 Obsidian 中!

注意:你还需要另一个名为 `Ozan's Image in Editor Plugin` 的插件,以便在其他笔记中查看这些绘图。

#### 高级表格

Markdown 最不友好的部分之一就是其表格语法。这使得通过自动格式化和电子表格公式处理表格变得更加友好。

#### 将URL粘贴到选中的文本中

选中文本,然后按下 `cmd-V`。文本现在会变成指向剪贴板中内容的链接!

#### 自然语言日期

我在任务中使用这个功能。

我输入的内容:

```markdown
- [ ] 一个任务 [计划 @今天]
```

我得到的结果:

```markdown
- [ ] 一个任务 [计划 :: 2023-09-14]
```

我使用这个设置来获取 `::`

![](nl_dates_config.png)

#### Obsidian Git

该插件自动将我的知识库备份到 Git 仓库中。它复刻了我 org-mode 配置的功能,但更胜一筹!
    
    #### Vimrc 支持

由于我在 Obsidian 中使用 Vim 键位绑定,这让我可以通过自定义 `.vimrc` 文件在一定程度上对其进行定制。

## 结论

总的来说,我很享受使用 Obsidian 的过程。而且,我发现离开终端处理某些任务并没有影响我的效率。听起来可能有些疯狂,但这是事实。如果你想开始使用 Obsidian,我建议不要去看那些与 Obsidian 笔记系统相关的 YouTube 视频。我发现它们更多是干扰而非帮助。只需按照你平时的方式记笔记,然后随着时间的推移逐步引入 Obsidian 的功能。

如果你对 Obsidian 或本文有任何想法、评论或建议,欢迎在下方留言!

←
macOS 上的 Hammerspoon 魔法
构建并将 Rust 部署到 Hugo 网站
→

back to top