适用于所有人
ob是什么
Obsidian is a powerful knowledge base on top of a local folder of plain text Markdown files.
这是ob官网对ob的核心介绍。翻译过来就是:“obsidian是构建在一个本地文件夹中的知识库,文件夹中放的是一些纯文本Markdown文件。”
针对这句话有几点需要阐明的是:
- ob是知识库管理工具,不单单是文字编辑器,和word,vim,notepad++这些有本质上的区别。学习ob的目的不仅仅是为了记笔记,而更多的是打造自己的知识体系,ob提供笔记管理的工具罢了。这些工具包括但不限于:优化输入体验(vim模式,模板,自动补全,代码高亮,智能列表,折叠缩进,智能粘贴,图片、音频、视频、网页等多媒体插入),笔记关联(双链,标签,块引用,关系图谱),高度开放的插件系统(目前计算机技术能实现的东西基本上都能在ob里实现,只是适不适合和值不值得的问题)。基于此,把ob理解为一款编辑器是很初级的看法。
- ob是本地的软件。顾名思义,ob不依赖于网络就可以正常运行,所有的数据都保存到本地,数据永远在自己手里。
- ob知识库就是一个文件夹。ob管理的所有数据都存在于一个文件夹中,这个文件夹称之为库(vault),包括配置文件和笔记文件。其中配置文件以
.obsidian
存在于库的根目录中,管理着ob的主题,样式,插件和一些运行时的数据。 - ob构建于Markdown文件之上。Markdown文件是以
.md
结尾的文件,内部是纯文本,可以用任何编辑器打开。md文件不仅仅有笔记的记录,还有格式的记录。
Markdown是什么
首先要明白的是一篇可读性好的笔记可以粗浅的分为内容和格式两个部分,在计算机中可以用标记语言来同时描述内容和格式,主流的是HTML/XHTML,是由一对尖括号进行标记,如下所示,其中:
<font>
被称为标签,描述内容的类型,以便赋予内容默认的格式,除此之外还有<h>
、<p>
、<audio>
等,分别代表标题,段落,音频color="red"
描述的是样式,即文字的格式是什么样的,通常可以独立成一个后缀为.css
的文件- 被
><
夹住的部分就是内容
<font class="text" color="red">红色内容</font>
但书写这样的内容显然可读性不好,且比较麻烦。一般普及到大众有两种方式:
- 鼠标操作:类似于word这样的,其底层依旧是HTML/XHTML或XML这样的标记语言,不信的话你把docx后缀的文件直接解压看看有什么。不同之处是利用鼠标或快捷键直接对选中的默认样式添加样式标签,再在界面上显示出来。这样的话,人们只看得到格式的变化,而看不到标签。
- 键盘操作:类似于Markdown这样,将格式标记精简成
# ## ==
这样,有利于键盘快速操作,但同时牺牲了格式调整,可喜的是可以和HTML混编。
下面正式介绍Markdown:
Markdown是一种轻量级标记语言,排版语法简洁,让人们更多地关注内容本身而非排版。它使用易读易写的纯文本格式编写文档,可与HTML混编,可导出 HTML、PDF 以及本身的 .md 格式的文件。因简洁、高效、易读、易写,Markdown被大量使用,如Github、Wikipedia等网站,如各大博客平台:WordPress、Drupal、简书等。
千万不要被「标记」、「语言」吓到,Markdown的语法十分简单,常用的标记符号不超过十个,用于日常写作记录绰绰有余,不到半小时就能完全掌握。就是这十个不到的标记符号,却能让人优雅地沉浸式记录,专注内容而不是纠结排版, 达到「心中无尘,码字入神」的境界。
学习方法与学习资源:
- 学习方法:学习自行车看一遍别人怎么骑的,自己马上实践,便是最好的方式,别去研究自行车为什么不会倒,甚至还顺便做点笔记-.-。能直接上手用就别去研究,Markdown同理。
- 学习资源:ob的帮助库,打开ob的左下角倒数第二个按钮。
下面是我的一些见解,可看可不看,但我必须说:
首先ob的定位是知识库管理工具,不是类似于word这样做海报,做宣传手册。知识库中的笔记一定要有一致性,以方便检索和查看,对什么内容在什么地方应一目了然,格式一旦确定便不应更改。Markdown具有这个性质,便被用上了,这是非常自然和合理的。但依旧会有人吐槽Markdown的设计哲学:
问:Markdown不能表格合并,表格也极其反人类,不好用
答:Markdown能通过HTML合并表格。Markdown本就是HTML简化的产物,对于简化得不优雅的东西当然就舍弃。如果你嫌用HTML太麻烦。那你何不通过ob设计一种新的格式语言,使用codeblock能很好的实现。这本是简洁与繁杂的权衡,每个人取舍不一样。不服的话要么自己写,要么白嫖他人的。如果连他人都没有实现,那肯定是你自己的问题。
问:ob为什么不做成word那样的编辑器,给个可选项也好呀!
答:键盘效率输入远比鼠标输入效率高,收获远比付出得多。被word养出来的思维惯性是可以改变的,为了适配这种惯性我认为是不值得的。会技术的人认为markdown效率高,没必要去做相关适配。不会技术的人不认为效率高,也做不了适配。
问:Markdown好难学,劝退劝退劝退
答:那你不应该做知识管理,这个更难。
使用ob你必须了解的
关于ob
About - Obsidian
关于obsidian为什么不开源的解答
为什么要开发另一个笔记应用程序呢?
就像那些陈词滥调一样,我们创办obsidian公司是因为Erica找不到任何东西能满足她建立个人知识库的需要。她已经尝试了从 TiddlyWiki 到The Brain的各种软件,但是没有一种感觉是正确的。
疫情隔离终于给了我们开始制作的机会。经过更多的思考,我们决定了obsidian的三个最基本的方向:
- Local-first and plain text 本地优先和纯文本;
- Link as first-class citizen 链接作为第一类公民;
- Make it super extensible. 使它具有超强的扩展性
虽然我们称之为个人知识库或者你的“第二大脑”,但是我们也喜欢把它看作是你笔记的 IDE。你可以把 IDE 想象成一个强大的前端,它试图理解你的代码,比如函数和变量存储在哪里,它们的类型是什么,这样做可以使你在输入代码时非常容易地浏览代码和获取建议。
从这个意义上说,对于目前大多数的笔记应用程序来说,使用笔记就像是在编写代码时没有语法突显、代码自动完成或者与 Git 集成。所有程序员几十年来认为理所当然的事情。你不觉得这很悲哀吗?今天的知识工作者一直面临着新的挑战,他们应该得到更好的工具。
是的,这就是为什么我们正在开发“又一个笔记应用程序”。
在obsidian之前,我们从2015年就开始研究 Dynalist,在此之前我们一起做过10多个副项目
目前的开发者有四位,分别是:
- Shida Li:负责后端,之前在Dropbox和Linkin工作,滑铁卢大学17‘ 软件工程专业
- Erica Xu:负责前端和UI,之前在 Quizlet 工作,滑铁卢大学16’计算机科学专业
- Sandy:办公室一号喵,轻音体柔喵喵叫。
- Blaze:办公室二号喵,像狗一样贼有活力,爱玩捉迷藏,更爱摇尾巴。
正是这两位大佬和数百位插件开发者创造了obsidian如此繁荣的生态,提供给个人完全免费的知识库管理工具。所以在碰到某些问题时多想想,我们是共同创造一项推动人类发展的事业。有技术的写插件,fork项目修bug,加feature,没技术的反馈bug,提issue,每个人都有能力也有机会使得obsidian更好。——致那些只会白嫖且爱BB的人
ob的价格
详情地址:Pricing - Obsidian
个人 | 赞助者 | 商业使用 | |
---|---|---|---|
权益 | 个人完全免费,无需登录,可访问所有插件和API,社区支持 | 支持开发,内测,社区徽章,开发频道 | 14天免费试用,商业使用,优先支持 |
价格 | $0 | 一次性赞助 $25 以上 | 每个用户每年 $50 |
另外一个收费项目是增值服务:
同步 | 发布 | |
---|---|---|
权益 | 端到端加密,版本历史,邮件优先支持 | 零门槛需求,笔记选择性发布,关系图和大纲,邮件优先支持 |
价格 | 年付 $8/月 | 年付 $16/月/站点 |
这里我翻译一下:个人用户使用本地服务完全不要钱,赞助25美元以上除了能获得内测资格和论坛徽章外,啥特殊服务都没有。同步要钱,因为使用到了服务器,obsidian的开发者需要钱购买服务器,你也可以自己同步。总结一下:不要钱,通通不要钱,就白嫖!
ob不完全的压力测试
测试条件:笔记本,未吃满任何硬件配置,win11,obidian版本v0.12.19,新库
单文件字数测试:我用vim生成了下列文件,并测试打开速度和ob的点击不同文件的反应。我做到800万字就是想搞清楚为什么总是秒开,可能只是部分渲染吧。
文件 | 文件字数 | 打开速度 | 反应 |
---|---|---|---|
文件1 | 100万字 | 秒开 | 正常 |
文件2 | 150万字 | 秒开 | 正常 |
文件3 | 200万字 | 秒开,显示建立索引,1s完成 | 正常 |
文件4 | 300万字 | 秒开,显示建立索引,7s完成 | 已然有点卡顿 |
文件5 | 400万字 | 秒开,显示建立索引 | 黑屏 |
文件6 | 500万字 | 秒开,显示建立索引 | 黑屏 |
文件7 | 800万字 | 秒开,显示建立索引 | 黑屏 |
多文件文件夹测试:用QQ群提供的中图法压缩包,里面包含47000余个文件和47000余个文件夹,内容大多只有几行到十几行文字。经测试后需要建立2-3分钟索引,之后可以秒开,但点击不同的文件反应速度明显降低。此时有比较轻微的卡顿,非常影响手感。
综上:ob目前支持300万字以下的单文件存在,4万个文件及文件夹左右。
学习路线
(仅代表我的个人建议)
ob既然是知识库管理软件,那必须了解的一定是基础操作:
- 官方示例库
- Ob软件基础操作教程-蚕子:非常详细的视频介绍
- 落山鸡编辑与维护的中文文档:内容多而全,是我的启蒙文档,可以探索到很多东西
其次是关于ob的最新情况及相关讨论:
- QQ群:774176839
- discord官方讨论群
- obsidian最新消息推送-英文
- obsidian开发计划
- obsidian中文论坛
- obsidian英文论坛
大致了解了ob,做了一定量的笔记,在提问之前建议先阅读:
之后最重要的是自己笔记系统的建立,可以通过学习模仿别人的笔记思路,找到适合自己的笔记方法。如果可以的话,有自己的体系后我建议分享出来,让大伙儿帮你看看有哪些可以优化的同时,帮助其它的人:
- 如何构建笔记系统-实际操作篇 - Ryooo
- 如何构建自己的笔记系统? - 知乎 (zhihu.com)
- Latest Knowledge management topics - Obsidian Forum
这部分内容中文论坛由于创建的较晚,并没有相关内容。建议去找找文献,问问大佬。
接着便是入插件坑,插件基本上都是世界各地开发者无偿开源制作的,在Github托管。此处可以找到关于插件最新消息,里面记录了插件的详细使用方式和使用文档,同时可以反馈给作者bug或者需求,作者都很nice。为了方便新手了解插件,推荐下载量前几名的插件:
- liamcain/obsidian-calendar-plugin:给ob加上日历视图,可以跳转到每日笔记
- tgrosinger/advanced-tables-obsidian:markdown表格增强工具,能更快速的制作表格
- blacksmithgu/obsidian-dataview:高性能笔记查询引擎,提供JavaScript API
- deathau/sliding-panes-obsidian:让编辑器变成滑动窗口,试了才知道妙处
- mgmeyers/obsidian-kanban:基于Markdown创建看板视图
- SilentVoid13/Templater:模板引擎,能插入变量和函数
- vslinko/obsidian-outliner:无序列表增强,快捷操作无序列表
- lynchjames/obsidian-mind-map:思维导图
目前插件数量已破300款,需要自己去探索符合你工作流的,如果需要推荐,可参考插件试用大佬的笔记:
以及github资源:kmaasrud/awesome-obsidian: Awesome stuff for Obsidian (github.com)
最后是活跃在互联网上的分享者,这些资源可以通过搜索引擎找到,包括但不限于知识管理,ob插件使用,多软件联动,如:
如何修改ob的默认样式
- 使用主题
- 使用带样式调整的主题,通过style settings插件调整,如:blue topaz,ITS,minimal等
- 寻求社区,Q群分享的样式片段,控制html样式的是以
.css
结尾的片段,放在.obsidian/snippets
路径下,供ob中外观设置中调用。 - 向主题作者反馈需要的样式,反馈方式在主题的github页面内,登陆后点击issues,发表你的看法。
- 自己写自定义样式片段 Obsidian主题样式修改半入门教学 - 经验分享 - Obsidian 中文论坛
以上四步循序渐进,没有开发背景谨慎自己写自定义样式片段,性价比太低,前端远比网上说的要繁琐,因为css是不正交的,新手容易出很多意料之外的问题。
如何访问社区插件
由于ob的社区插件构建在github上,国内访问可能存在问题,因此提供以下方式解决,根据关键字搜索教程,不详述:
- Steam++ 开源软件:修改hosts文件,反向代理实现
- github加速服务:Releases · dotnetcore/FastGithub
- 插件搬迁网友:宏沉一笑-插件发布与更新通知 - 经验分享 - Obsidian 中文论坛,他还做了个插件
- 插件访问修复:完美解决obsidian无法加载第三方插件(社区插件)的问题 - 经验分享 - Obsidian 中文论坛
- 科学上网
ob同步问题
obsidian多端同步专题 - 经验分享 - Obsidian 中文论坛:很详细了,不赘述
适用于开发者或进阶使用
ob是什么
ob是基于electron构建的应用程序。以electron构建的应用程序有:vscode,Microsoft Team,WhatsApp等,有开源,跨平台的特征。
由于Electron 基于 Chromium 和 Node.js构建应用,所以可以使用 HTML, CSS 和 JavaScript常规web开发特性,还可以通过Node.js访问本地文件及操作系统API,这是浏览器做不到的。因此,ob支持调用python,go等脚本的同时,支持利用ob的api更改UI和操作逻辑。
如何调用脚本
目前我知道的有三种方式:
- 写插件
- 调用插件提供的脚本接口
- 外部脚本直接操作md文档:不能访问ob API且需要打开其他界面,失去了操作一致性。
写插件能在渲染进程和主进程中运行逻辑,调用插件提供的脚本接口只能调用暴露出来的ob的API。支持此种操作的插件我目前使用的是quickadd和dataview。
其中quickadd在macro类型里能调用库中指定目录下的script,仅支持JavaScript。但通过node进程中的exec
函数,能调用其它语言类型的脚本。dataview支持在编辑器中直接写脚本,支持的也是JavaScript。
脚本的一些实践
示例:
- 『晒晒我的工作区』个人主页面板 - 经验分享 - Obsidian 中文论坛
- 库统计脚本片段
- 用 Obsidian 追踪项目(Metaedit、Dataview及Kanban) - 经验分享 - Obsidian 中文论坛
以下脚本可以在quickadd中配置成命令,配合button插件能实现一键打开库路径下的控制台,我常用于git做分支笔记,对比修改历史,推送等。
const child_process = require('child_process')
const openTerminalCommand = "wt -d D:\\Temp\\14-Obsidian-demo"
module.exports = async (params) => {
await child_process.exec(openTerminalCommand)
}
以下脚本在quickadd中配置成命令,划选关键字作为文件夹名称,同时在文件夹下创建同名笔记。
module.exports = async (params) => {
//获取选区并替换成链接
let view = params.app.workspace.activeLeaf.view
let selection
if (!view) {
} else {
let view_mode = view.getMode();
switch (view_mode) {
case "preview":
break;
case "source":
if ("editor" in view) {
selection = view.editor.getSelection();
view.editor.replaceSelection(`[[${selection}]]`);
}
break;
default:
break;
}
}
let noteName = selection
//构造文件路径
basePath = params.app.vault.adapter.basePath
currentFilePath = params.app.workspace.activeLeaf.view.file.path
fullPath = basePath + "\\" + currentFilePath
createNewDirPath = fullPath.substring(0, fullPath.lastIndexOf('/')) + '\\' + noteName
await params.app.vault.adapter.fs.mkdirSync(createNewDirPath)
const fileDescription = params.app.vault.adapter.fs.openSync(createNewDirPath+ '\\' + noteName + '.md', 'w')
await params.app.vault.adapter.fs.closeSync(fileDescription)
}
利用dataview提取目的标签所在的行内容形成表格,用于整库的标签汇总:
const files = app.vault.getMarkdownFiles()
let arr = files.map(async(file) => {
const content = await app.vault.cachedRead(file)
let lines = await content.split("\n").filter(line => line.includes("#todo"))
//console.log(lines)
return ["[["+file.name.split(".")[0]+"]]", lines]
})
Promise.all(arr).then(values => {
const beautify = values.map(value => {
const temp = value[1].map(line => { return line.trim().split('#')[0].substr(2)})
return [value[0],temp]
})
const exists = beautify.filter(value => value[1][0] && value[0] != "[[Dashboard]]")
dv.table(["文件", "出处"], exists)
})
利用dataview填充模板,在笔记内显示入链和出链,这里用的是dataview的Sql语法:
list from [[#]]
list from outgoing([[#]])
总的来说,脚本配合插件能做到你想做的任何事,管中窥豹,可见一斑。
插件开发
Obsidian Plugin Developer Docs | Obsidian Plugin Developer Docs (marcus.se.net)
上述链接是目前为止针对插件开发最全面的资源,包括:
- obsidian中Anatomy of a plugin,vault,workspace基本概念
- commands,status bar, settings, models, events, HTML elements, Editor 等概念
- React和Svelte搭建的插件模板
- 示例插件
- 插件的发布流程
- API参考,比官方的更易读
- Manifest参考
常用资源
- obsidianmd/obsidian-sample-plugin (github.com):插件模板
- obsidianmd/obsidian-api (github.com)
- pjeby/hot-reload:插件热加载,类似于vscode中的live serve,用于插件开发
- (转载)Obsidian 开发相关(简单引导) - 开发讨论 - Obsidian 中文论坛
- quickadd源码及文档-github:包含quickadd提供的四个类型、数个示例、quickadd API、格式语法、inline script、macros
- Dataview 文档-githubio