请从这里开始

请从这里开始

开始食用

  • 在文档树面板的 更多​ 菜单中新建笔记本,在笔记本下新建文档
  • 在编辑器中输入 /​ 触发功能菜单
  • 在内容块中遨游[1]、窗口和页签[2]

饮品推荐

️ 我们的家

参与贡献

如果你感到官方用户指南过于硬核,请尝试从社区资源[5]开始。

我们希望在接下来的时间里,思源能够成为你生活和学习的效率工具,帮助你实现更多的目标和计划


内容块

在思源[6]中,唯一重要的核心概念是内容块[7]。通过排版格式即可形成内容块,这样我们就能在块级粒度上对思绪和知识进行整理,同时也能方便长文阅读和输出。

什么是内容块[7:1]

内容块类型[8]

引用内容块[9]

在内容块中遨游[1:1]

文档块和标题块的转换[10]

嵌入内容块[11]

内容块属性[12]

编辑器

排版元素[13]

优化排版[14]

通过标题列表概述[15]

搜索进阶

查询语法[16]

数据库表[17]

类型过滤[18]

忽略索引[19]

忽略搜索[20]

自定义外观

图标[21]

主题[22]

通用操作

工作空间[23]

导入和导出[24]

剪藏[25]

窗口和页签[2:1]

日记[26]

书签和标签[27]

数据库[28]

挂件[29]

插件[30]

资源文件[31]

模板片段[32]

PDF 标注[33]

虚拟引用[34]

超链接[35]

数据历史[36]

闪卡[37]

人工智能[38]

快捷键[39]

在浏览器上使用[40]

Docker 伺服[41]

内核参数[42]

内核 API[43]

分享文档[44]

发布服务[45]

会员特权

云端服务[46]

存储空间[47]

数据同步[48]

数据备份[49]

资源文件图床[50]

收集箱[51]

微信提醒[52]

限制[53]

功能特性[54]

对接第三方云端存储[55]

搜索资源文件内容[56]

其他

移动端 App[57]

常见问题[3:1]

数据安全[58]

术语表[59]

性能优化[60]

社区资源[5:1]

最新进展[61]

扩展开发[62]

隐私政策和用户协议[63]

致谢[64]


  1. 在内容块中遨游

    链接

    文档内容中的链接分为两种:

    • 标准 URL 超链接,使用浏览器打开,用于互联网资源访问
    • 通过引用[9:1]建立的内容块链接,用于在思源内部进行双链

    缩放聚焦

    • 在块标上右键下拉菜单中选择聚焦后,编辑器会聚焦到该内容块上
    • 通过编辑器顶部的面包屑导航能够在上下文中进行跳转

    关系图

    关系图分为文档级和全局。文档的关系图是以当前文档块展开,并呈现所有和该文档有关联的(正向链接和反向链接)内容块;全局关系图是所有笔记本中所有的块和链接关系。

    按住 Ctrl 单击节点:跳转到该节点。

    反向链接

    反向链接是文档级的,列出当前文档中内容块被引用和被提及所在的块。

    链接

    • 鼠标悬浮块引用前面的标识会弹出预览浮窗
    • 单击反链列表中的块引用进行跳转

    提及

    提及使用当前文档中内容块命名、别名、引用锚文本和文档名作为关键字进行搜索(可在 设置​ - 搜索​ - 反链提及​ 中设置搜索范围),搜索结果为包含这些关键字的内容块。

    ​#注意#​:提及搜索仅会在普通文本中搜索,不会在粗体、斜体等行级元素和代码块、图表等块级元素中搜索,这一点和虚拟引用探测规则[^5]是相同的。 ↩︎ ↩︎

  2. 窗口和页签

    思源支持多窗口和多页签,这样可以方便地进行文档编辑和查看。

    页签上支持上下和左右分屏,打开的所有页签是实时同步内容的。比如对于相同一份文档进行多开页签,在其中一个页签中编辑保存后,其他页签也会自动同步最新内容,在享受多开的便利时避免脏数据覆盖。

    除了文档保存是同步的,保存后产生的关联渲染也是同步的,文档相关的内容块预览以及关系图都是实时刷新,这样能在最小限度上排除干扰,让我们将注意力集中在笔记内容上。

    除了分屏操作,页签也支持拖拽,这样我们能够随心所欲地布置整个界面,在自己最舒服的布局下记录笔记和整理知识。

    如果你正在使用的设备屏幕较小,可以考虑通过浏览器使用[40:1],这样就能通过浏览器实例进行整体界面切换。如果你只需要将页签转换为独立的窗口,可以在页签上右键点击 移动到新窗口​,或者将页签拖拽到当前窗口之外的地方后释放拖拽,这样也能将该页签转换为独立的窗口。 ↩︎ ↩︎

  3. 常见问题

    思源是如何存储数据的?

    数据保存在工作空间[23:1]文件夹下,在工作空间/data/ 文件夹下:

    • assets​ 用于保存所有插入的资源文件[31:1]
    • emojis​ 用于保存自定义图标表情图片
    • snippets​ 用于保存代码片段
    • storage​ 用于保存查询条件、布局和闪卡[37:1]数据等
    • templates​ 用于保存模板片段[32:1]
    • widgets​ 用于保存挂件[29:1]
    • plugins​ 用于保存插件[30:1]
    • public​ 用于保存公开的数据
    • 其余文件夹就是用户自己创建的笔记本文件夹,笔记本文件夹下 .sy​​​​ 后缀的文件用于保存文档数据,数据格式为 JSON

    支持通过第三方同步盘进行数据同步吗?

    不支持通过第三方同步盘进行数据同步,否则可能会导致数据损坏。虽然不支持第三方同步盘,但是支持对接第三方云端存储[55:1]

    另外,也可以考虑手动导出导入 Data 实现数据同步:

    • 桌面端:设置​ - 导出​ - 导出 Data​ / 导入 Data
    • 移动端:右侧栏​ - 关于​ - 导出 Data​ / 导入 Data

    思源是开源的吗?

    思源笔记是完全开源的,在 GitHub 上可以找到完整的源代码。

    如何升级到新版本?

    • 如果是通过应用商店安装的,请通过应用商店更新
    • 如果是桌面端通过安装包安装的,可打开 设置 - 关于 - 自动下载更新安装包 选项,这样思源会自动下载最新版安装包并提示安装
    • 如果是通过手动安装包安装的,请再次下载安装包安装

    可在 设置​ - 关于​ - 当前版本​ 中 检查更新​,也可以通过关注官方网站来获取新版本。

    有的块(比如在列表项中的段落块)找不到块标怎么办?

    在列表项下的第一个子块是省略块标的。可以将光标移到这个块中,然后通过 Ctrl+/ 触发它的块标菜单。

    数据仓库密钥遗失怎么办?

    • 如果之前在多个设备上正确初始化过数据仓库密钥的话,那么该密钥在所有设备上都是相同的,可以在 设置 - 关于 - 数据仓库密钥 - 复制密钥字符串 找回

    • 如果之前没有正确配置(比如多个设备上密钥不一致)或者所有设备均不可用,已经无法获得密钥字符串,则可通过如下步骤重置密钥:

      1. 手动备份好数据,可通过 导出 Data 或者直接在文件系统上复制 工作空间/data/ 文件夹
      2. 设置 - 关于 - 数据仓库密钥 - 重置数据仓库
      3. 重新初始化数据仓库密钥,在一台设备上初始化密钥以后,其他设备导入密钥
      4. 云端使用新的同步目录,旧的同步目录已经无法使用,可以删除
      5. 已有的云端快照已经无法使用,可以删除

    使用需要付费吗?

    大部分功能是免费的,即使是在商业环境下使用。

    会员特权[^22]需要付费后才能使用,请参考定价

    如果你没有会员特权需求但又想支持开发,欢迎进行捐赠:靠爱发电 - 链滴

    “思源”命名的由来

    思源这个名字取自中国古代成语“饮水思源”,其字面意思是“喝水的时候,要想到水是从哪里来的”,比喻不忘本、知感恩。

    我们希望用户在使用思源笔记进行知识管理的时候不要忘记知识的出处和关联,更重要的是不要忘记通过自己的所学回报社会,回报全人类。 ↩︎ ↩︎

  4. 思源是开源的吗?

    思源笔记是完全开源的,在 GitHub 上可以找到完整的源代码。 ↩︎

  5. 社区资源

    概述

    我们整理了一些来自社区的优秀资源。如果你发现了其他精彩内容,欢迎反馈给我们。

    入门视频教程

    从入门到精通使用视频教程

    新手图文教程

    使用心得

    知识管理方法论

    ↩︎ ↩︎
  6. “思源”命名的由来

    思源这个名字取自中国古代成语“饮水思源”,其字面意思是“喝水的时候,要想到水是从哪里来的”,比喻不忘本、知感恩。

    我们希望用户在使用思源笔记进行知识管理的时候不要忘记知识的出处和关联,更重要的是不要忘记通过自己的所学回报社会,回报全人类。 ↩︎

  7. 什么是内容块

    内容块定义

    “#内容块#”指的是一块内容,每块这样的内容通过一个全局唯一的 ID 进行标识。ID 是程序自动生成的,形如: 202008250000-a1b2c3d,由时间和 7 位随机字符组成。

    内容块类型

    最常见的内容块就是我们所熟悉的段落(Paragraph)。在中文传统排版中,段落通常是通过段首缩进(空两格)来表示,互联网的发展逐渐影响了段落的表示,现在使用较多的方式是增加段落之间的行距,或者使用空行来分隔段落。

    实际使用时,仅仅靠段落排版是不够的,往往还需要用到标题(Heading)、列表(List)、表格(Table)、块引用(Blockquote)等来丰富我们的排版。这些排版样式除了视觉上的不同,更重要的是它们在一定程度上表达了内容的语义。比如在看到无序列表时,我们可以知道每个列表项是不分先后的平级关系,而在看到有序列表时则相反。

    所以,内容块存在所有类型的块[8:2],不同的排版格式会形成不同的内容块。#内容块/类型#

    组合内容块

    一篇文档是一些内容块的组合,内容块是基本单位。这就好比乐高积木,可以使用不同的基本模块进行组合。#注意#:文档本身也是一种内容块,更准确地说,文档块、列表块、引述块这三种内容块是容器块,他们可以包含其他任意类型的内容块。#内容块/组合#

    至此,我们已经能够用内容块来描述所有的内容了,这样就能通过统一的用法来引用[9:2]了。逻辑上没有页面(Page)概念,减少使用中不必要的负担,让用户将注意力集中在内容块上。

    命名和备注

    我们可以为每个内容块命名、添加别名和备注。命名和别名主要用于反链提及[^41]搜索,备注用于记录一些不便在内容区中出现的信息。

    设置 - 编辑器 中打开显示书签、命名、别名标识选项后,被命名的内容块在编辑器中会被加上外框显示。如果对文档块进行命名和备注,则当鼠标悬浮文档树文档上时将浮出该文档的相关命名和备注信息。

    可使用嵌入内容块[11:1]对命名和备注进行搜索汇总,比如列出备注中包含 简短 关键字的内容块:

    我们可以为每个内容块命名、添加别名和备注。命名和别名主要用于反链((20210106201736-oyu11fw "提及"))搜索,备注用于记录一些不便在内容区中出现的信息。

    ​#注意#​:

    • 命名是唯一的,一个块只能设置一个命名
    • 别名可以设置多个,通过英文状态下的逗号(,​)分隔
    • 备注仅支持纯文本
    ↩︎ ↩︎
  8. 内容块类型

    内容块类型简述

    鼠标悬浮在内容块上左侧会出现该内容块对应的图标。

    标识 类型 元类型[^7]
    paragraph.svg 段落块 叶子块
    heading.svg 标题块 叶子块
    math-block.svg 数学公式块 叶子块
    code-block.svg 代码块 叶子块
    table.svg 表格块 叶子块
    html-block-20220429115636-e80k6ty.svg HTML 块 叶子块
    unordered-list.svg 无序列表块 容器块
    ordered-list.svg 有序列表块 容器块
    task-list.svg 任务列表块 容器块
    list-item.svg 列表项块 容器块
    blockquote.svg 引述块 容器块
    super-block.svg 超级块 容器块
    doc.svg 文档块 容器块

    内容块类型详解

    下面我们分别介绍一下这些内容块类型的细节。#内容块/类型#

    段落块

    paragraph.svg

    这里是一个示例段落。

    在一个段落后直接回车会形成新的段落。

    标题块

    heading

    以上就是标题块,支持一级到六级。

    ​#注意#​:

    不建议在正文中使用一级标题,建议使用二级标题作为顶层标题,这样在开启了 设置​ - 导出​ - 添加文档标题​ 后,整体的标题层级在导出时才符合正常逻辑。

    数学公式块

    math-block

    $$
    a^2 + b^2 = c^2
    $$

    代码块

    code-block

    function hello() {}
    

    表格块

    table

    列一 列二
    行一列一 行一列二
    行二列一 行二列二

    如果需要在表格块中使用 |​ ,请使用 \​ 转义,即需要输入 \|​。

    如果需要在表格块中换行,请使用 Shift+Enter​ 。

    HTML 块

    html-block-20220429115636-e80k6ty.svg

     好 hǎo  世 shì  界 jiè
    Hello World

    ​#注意#​:

    • 使用 HTML 块时默认会对其中的代码进行安全过滤,如果不需要过滤,请开启 设置​ - 编辑器​ - 允许执行 HTML 块内脚本​,但请确认代码安全后再开启,以免遭遇跨站脚本攻击(XSS)
    • 因为 Markdown 规范对 HTML 块解析规则较为复杂,建议使用 <div></div>​ 包裹 HTML 代码并去掉空行

    无序列表块

    unordered-list

    • 列表项一
    • 列表项二

    无序列表块是一种元类型[^7]。

    无序列表块只能包含列表项块,相邻的无序列表块间距较大。

    有序列表块

    ordered-list

    1. 列表项一
    2. 列表项二

    有序列表块是一种元类型[^7]。

    有序列表块只能包含列表项块,相邻的有序列表块间距较大。

    任务列表块

    task-list

    任务列表块是一种元类型[^7]。

    任务列表块只能包含列表项块,相邻的任务列表块间距较大。

    列表项块

    list-item

    通过列表项块可以实现大纲式笔记的基本用法,列表项块是一种元类型[^7]。

    列表项块被包含在列表块内,相邻的列表项块间距较小。

    如果需要在列表项中换行,请使用 Shift Enter​。

    引述块

    blockquote

    注意不是内容块引用,而是引述块(Blockquote)。

    引述块是一种元类型[^7]。

    超级块

    super-block

    超级块是一种元类型[^7]。可用于组合文档内连续的内容块,也用于支持横向排版。

    文档块

    doc

    整个文档是一个块,文档块是一种元类型[^7]。

    内容块元类型

    内容块在逻辑上分为叶子块和容器块,叶子块不能包含其他块,容器块可以包含其他块:

    • 列表块:只能包含列表项块
    • 列表项块:可以包含任意非文档块
    • 引述块:可以包含任意非文档块
    • 超级块:可以包含任意非文档块
    • 文档块:可以包含任意非文档块
    ↩︎ ↩︎ ↩︎
  9. 引用内容块

    概述

    输入 (( 后将触发内容块引用搜索,继续输入作为搜索关键字,在搜索结果中使用上下键选定后回车就可以完成内容块的引用了。建立好内容块引用后,鼠标悬浮在锚文本上后将弹出预览浮层,展现被引用的内容块(定义块)。#内容块/引用#

    链接方向

    • 正向链接(Forwardlink),即当前内容块使用了哪些其他内容块
    • 反向链接(Backlink),即当前内容块被那些其他内容块使用了

    正向链接包含在当前块的内容中,我们可以很直观的看到。反向链接需要在其他文档中搜索才能知道,而恰恰是这些信息对我们比较有价值。我们可以通过以下两种方式来帮助我们更好的掌握知识点或者发散思路:

    • 关系图[^3]:浏览内容块之间的正向和反向链接关系
    • 反向链接[^4]:以文本列表的方式展现当前内容块的反向链接

    锚文本

    锚文本即渲染引用时看到的文本,分为静态锚文本和动态锚文本:

    • 静态锚文本:不会跟随定义块内容变化,即固定展现指定的内容
    • 动态锚文本:跟随定义块内容变化,最大长度可在 设置 - 编辑器 - 块引动态锚文本最大长度 中设置,最长支持 5120 个字符

    修改锚文本的方式如下:

    • 将光标插入符移入引用元素,直接修改内容,这样会将该引用的锚文本设置为静态锚文本
    • 右键单击引用元素后在弹出的菜单中修改锚文本,这样得到的锚文本也是静态锚文本
    • 右键单击引用元素后在弹出的菜单中清空锚文本,这样将使用动态锚文本

    ((​ 搜索结果列表中:

    • 直接 Enter​ 或者 点击​ 将使用动态锚文本
    • 按住 Ctrl+Enter​ 或者 Ctrl+点击​ 将使用静态锚文本

    筛选

    设置​ - 编辑器​ 中启用 [[ 仅搜索文档​ 后:

    • 使用 ((​​ 在所有类型的块[8:1]中进行搜索
    • 使用 [[​ 仅搜索文档块[^8]

    语法

    除了使用 (( 触发引用搜索外,也可以直接使用语法 ((id "锚文本"))

    • 使用 " 包裹锚文为静态锚文本
    • 使用 ' 包裹锚文本为动态锚文本,会在重建索引时自动重写

    直接使用语法的主要场景是通过外部工具或者 API 建立引用,大部分情况下我们主要还是直接使用 ((​ 触发引用搜索来建立引用。 ↩︎ ↩︎ ↩︎

  10. 文档块和标题块的转换

    文档块和标题块的对应关系

    标题块和文档块具有天然的对应关系,因为:

    • 每一个文档块都有一个名称
    • 每一个标题块也都有一个名称

    所以我们可以在文档块和标题块之间进行相互转换。另外,因为内容块是根据 id 进行引用的,所以转换过程不会破坏已有的引用关系。

    将文档块转换为标题块

    在文档树上,选择需要转换为标题块的文档,然后将其拖拽到编辑器页签中需要插入的位置。这里有两种情况:

    1. 将文档块放置到已有标题块上,此时文档块将作为该标题块的平级节点插入到下方
    2. 将文档块放置到非标题块上,此时文档块将作为该块所属标题块的子节点插入

    文档块转换为标题块后:

    • 原文档名将变为标题名

    • 逻辑上文档块是一级标题,会根据插入位置进行相对层级变更

    • 原文档内的各标题层级会根据插入位置进行调整

      • 对于上述情况一:比如原文档内包含一、二、三级标题,插入位置是一个二级标题,则文档块转换后的标题块会是一个二级标题,原来内容中的一、二、三级标题会变为二、三、四级标题
      • 对于上述情况二:比如原文档内包含一、二、三级标题,插入位置是一个二级标题下的段落块,则文档块转换后的标题块会是一个三级标题,原来内容中的 一、二、三级标题会变为三、四、五级标题

    将标题块转换为文档块

    在编辑器页签中选择需要转换的标题块,按住该标题块的块标,然后就可以将其拖拽到文档树上转换了,标题块转换为文档块后:

    • 标题名将变为文档名
    • 原标题块下如果有子标题,则会按照这些子标题中最大的层级作为新文档中二级标题,其余子标题会根据相对层级进行调整,比如原标题块下包含了三、四、五级子标题,则转换为文档块后会将这些子标题转换为二、三、四级标题

    将列表项块转换为文档块

    除了将标题块转换为文档块,还可以将列表项块转换为文档块(是列表项块,不是列表块),按住该列表项块的块标,然后就可以将其拖拽到文档树上转换了,列表项块转换为文档块后:

    • 列表项块的首个子块的内容将变为文档名
    • 列表项块的子块保持原样
    ↩︎
  11. 嵌入内容块

    概述

    嵌入内容块主要用于汇总所需内容块,通过 {{}} 将 SQL 脚本包裹起来并独占一行:{{ SELECT * FROM blocks WHERE content LIKE '%关键字%' }},数据库表请参考这里[^43]。#内容块/嵌入#

    示例

    • 查询内容中包含 内容块 的列表项:

      {{ SELECT * FROM blocks WHERE content LIKE '%内容块%' AND type = 'i' }}
      
    • 查询内容中同时包含 内容块引用 段落块:

      {{ SELECT * FROM blocks WHERE content LIKE '%内容块%' AND content LIKE '%引用%' AND type = 'p') }}
      
    • 查询内容中同时包含 内容块嵌入 的标题块并按更新时间降序结果取前 2 条:

      {{ SELECT * FROM blocks WHERE content LIKE '%内容块%' AND content LIKE '%嵌入%' AND type = 'h' ORDER BY updated DESC LIMIT 2 }}
      

    案例一

    查询同时包含 在思源中核心概念 文本的段落块,并排除当前文档(否则当段落块也会包含到结果集中,因为当前段落同样包含了这两个文本,下面的案例类似):

    在思源中,唯一重要的核心概念是内容块。通过排版格式即可形成内容块,这样我们就能在块级粒度上对思绪和知识进行整理,同时也能方便长文...

    案例二

    查询包含标签 #内容块/嵌入#​ 或 #内容块/引用#​ 的段落块:

    输入 (( 后将触发内容块引用搜索,继续输入作为搜索关键字,在搜索结果中使用上下键选定后回车就可以完成内容块的引用了。建立好内容块引用后,鼠标悬浮在锚文本上后将弹出预览浮层,展现被引用的内容块(定义块)。#内容块/引用#

    案例三

    有时候我们可能需要随机漫游显示内容块,以方便回顾。

    • WeekdayCN2​:该函数用于返回周几 Sunday=天, Monday=一, ..., Saturday=六

    • 普通文本

    标签支持层级,这样可以更方便地对内容块进行分类整理。不同层级之间使用 / 分隔,像这样 #A/B/C#

    案例四

    查询未完成的任务列表项,这里需要使用 markdown 字段而不是 content 字段:

    ↩︎ ↩︎ ↩︎
  12. 内容块属性

    概述

    属性以键值对(key-value)的形式存在,我们可以通过对内容块设置属性来丰富内容块的内涵。属性分为内置属性和自定义属性。

    内置属性

    属性名 描述
    name 内容块的命名
    alias 内容块的别名
    memo 内容块的备注
    bookmark 内容块的书签

    自定义属性

    自定义属性由用户通过 块标菜单 - 属性 进行设置,属性名仅允许使用英文字母和阿拉伯数字(例如 doing 7days)。设置后,思源会自动在属性名前加上前缀 custom-,以区分内置属性和自定义属性。

    根据属性查询内容块

    例如,当我们为内容块设置了 progress=30priority=2 属性后,则可以通过 SQL 查询出所有进度为 30、优先级为 2 的内容块:

    SELECT *
    FROM blocks
    WHERE id IN (
        SELECT block_id
        FROM attributes AS a
        WHERE (a.name = 'custom-progress' AND a.value = '30')
           OR (a.name = 'custom-priority' AND a.value = '2')
        GROUP BY block_id
        HAVING count(block_id) = 2
    );
    
    ↩︎
  13. 排版元素

    行级元素

    • 块引用[^49]

    • 超链接

    • 图片

      可通过复制粘贴或拖拽来上传图片;上传后的图片可通过拖拽进行大小调整。

    • 加粗

    • 倾斜

    • 下划线

    • 删除线

    • 标记

    • 上标

    • 下标

    • 快捷键

    • 标签#

    • 行级代码

    • $a^2 + b^2 = \color{red}c^2$

    • 备注(这是一个行级备注)

    • 颜色 1 颜色 2 颜色 3 颜色 4 颜色 5 颜色 6 颜色 7 颜色 8 颜色 9 颜色 10 颜色 11 颜色 12 颜色 13

      特效 1 特效 2

    • 通过输入 : 加字母触发表情字符搜索 ❓ ❤️ ☕️

    超级块

    段落一

    段落二居中

    段落三

    段落四居右

    嵌入块

    标题块

    有序、无序、任务列表

    无序列表

    • Java

      • Spring

        • IoC
        • AOP
    • Go

      • gofmt
      • Wide
    • Node.js

      • Koa
      • Express

    有序列表

    1. Node.js

      1. Express
      2. Koa
      3. Sails
    2. Go

      1. gofmt
      2. Wide
    3. Java

      1. Latke
      2. IDEA

    任务列表

    引述块

    注意不是内容块引用,而是引述块(Blockquote)。

    代码块

    如果在 ``` 后面跟随语言名称,可以有语法高亮的效果哦,比如:

    演示 Go 代码高亮

    package main
    
    import "fmt"
    
    func main() {
    	fmt.Println("Hello, 世界")
    }
    

    演示 Java 高亮

    public class HelloWorld {
    
        public static void main(String[] args) {
            System.out.println("Hello World!");
        }
    
    }
    

    Tip: 语言名称支持下面这些: ruby, python, js, html, erb, css, coffee, bash, json, yml, xml ...

    表格

    header 1 header 2
    cell 1 cell 2
    cell 3 cell 4
    cell 5 cell 6

    HTML 块

     好 hǎo  世 shì  界 jiè
    Hello World

    更多细节请参考 HTML 块注意[^90]。

    分隔线


    数学公式

    $$
    \frac{1}{
    \Bigl(\sqrt{\phi \sqrt{5}}-\phi\Bigr) e^{
    \frac25 \pi}} = 1+\frac{e^{-2\pi}} {1+\frac{e^{-4\pi}} {
    1+\frac{e^{-6\pi}}
    {1+\frac{e^{-8\pi}}{1+\cdots}}
    }
    }
    $$

    IFrame

    视频

    音频

    脑图

    - 教程
    - 语法指导
      - 普通内容
      - 提及用户
      - 表情符号 Emoji
        - 一些表情例子
      - 大标题 - Heading 3
        - Heading 4
          - Heading 5
            - Heading 6
      - 图片
      - 代码块
        - 普通
        - 语法高亮支持
          - 演示 Go 代码高亮
          - 演示 Java 高亮
      - 有序、无序、任务列表
        - 无序列表
        - 有序列表
        - 任务列表
      - 表格
      - 隐藏细节
      - 段落
      - 链接引用
      - 数学公式
      - 脑图
      - 流程图
      - 时序图
      - 甘特图
      - 图表
      - 五线谱
      - Graphviz
      - 多媒体
      - 脚注
    - 快捷键
    

    使用 Markdown 列表语法渲染脑图。

    流程图

    graph TB c1-->a2 subgraph one a1-->a2 end subgraph two b1-->b2 end subgraph three c1-->c2 end

    语法请参考 Mermaid

    时序图

    sequenceDiagram Alice->>John: Hello John, how are you? loop Every minute John-->>Alice: Great! end

    语法请参考 Mermaid

    甘特图

    gantt title A Gantt Diagram dateFormat YYYY-MM-DD section Section A task :a1, 2019-01-01, 30d Another task :after a1 , 20d section Another Task in sec :2019-01-12 , 12d another task : 24d

    语法请参考 Mermaid

    类图

    classDiagram Class01 <|-- AveryLongClass : Cool Class03 *-- Class04 Class05 o-- Class06 Class07 .. Class08 Class09 --> C2 : Where am i? Class09 --* C3 Class09 --|> Class07 Class07 : equals() Class07 : Object[] elementData Class01 : size() Class01 : int chimp Class01 : int gorilla Class08 <--> C2: Cool label

    语法请参考 Mermaid

    用户游历图

    journey title My working day section Go to work Make tea: 5: Me Go upstairs: 3: Me Do work: 1: Me, Cat section Go home Go downstairs: 5: Me Sit down: 5: Me

    语法请参考 Mermaid

    Git 图

    gitGraph commit commit branch develop commit commit commit checkout main commit commit

    语法请参考 Mermaid

    实体关系图

    erDiagram CUSTOMER ||--o{ ORDER : places ORDER ||--|{ LINE-ITEM : contains CUSTOMER }|..|{ DELIVERY-ADDRESS : uses

    语法请参考 Mermaid

    图表

    {
      "title": { "text": "最近 30 天" },
      "backgroundColor": "transparent",
      "tooltip": { "trigger": "axis", "axisPointer": { "lineStyle": { "width": 0 } } },
      "legend": { "data": ["帖子", "用户", "回帖"] },
      "xAxis": [{
          "type": "category",
          "boundaryGap": false,
          "data": ["2019-05-08","2019-05-09","2019-05-10","2019-05-11","2019-05-12","2019-05-13","2019-05-14","2019-05-15","2019-05-16","2019-05-17","2019-05-18","2019-05-19","2019-05-20","2019-05-21","2019-05-22","2019-05-23","2019-05-24","2019-05-25","2019-05-26","2019-05-27","2019-05-28","2019-05-29","2019-05-30","2019-05-31","2019-06-01","2019-06-02","2019-06-03","2019-06-04","2019-06-05","2019-06-06","2019-06-07"],
          "axisTick": { "show": false },
          "axisLine": { "show": false }
      }],
      "yAxis": [{ "type": "value", "axisTick": { "show": false }, "axisLine": { "show": false }, "splitLine": { "lineStyle": { "color": "rgba(0, 0, 0, .38)", "type": "dashed" } } }],
      "series": [
        {
          "name": "帖子", "type": "line", "smooth": true, "itemStyle": { "color": "#d23f31" }, "areaStyle": { "normal": {} }, "z": 3,
          "data": ["18","14","22","9","7","18","10","12","13","16","6","9","15","15","12","15","8","14","9","10","29","22","14","22","9","10","15","9","9","15","0"]
        },
        {
          "name": "用户", "type": "line", "smooth": true, "itemStyle": { "color": "#f1e05a" }, "areaStyle": { "normal": {} }, "z": 2,
          "data": ["31","33","30","23","16","29","23","37","41","29","16","13","39","23","38","136","89","35","22","50","57","47","36","59","14","23","46","44","51","43","0"]
        },
        {
          "name": "回帖", "type": "line", "smooth": true, "itemStyle": { "color": "#4285f4" }, "areaStyle": { "normal": {} }, "z": 1,
          "data": ["35","42","73","15","43","58","55","35","46","87","36","15","44","76","130","73","50","20","21","54","48","73","60","89","26","27","70","63","55","37","0"]
        }
      ]
    }
    

    可使用如下三种格式定义:

    • JSON

      {
          "propName": "propValue"
      }
      
    • JavaScript Object

      {
          propName: 'propValue',
      }
      
    • 返回一个 JavaScript Object 的立即执行函数

      (() => {
          const option = {};
          option.propName = `propValue`;
          return option;
      })()
      

    具体语法请参考 ECharts

    五线谱

    %%params {tablature: [{instrument: "violin"}]}
    X: 24
    T: Clouds Thicken
    C: Paul Rosen
    S: Copyright 2005, Paul Rosen
    M: 6/8
    L: 1/8
    Q: 3/8=116
    R: Creepy Jig
    K: Em
    |:"Em"EEE E2G|"C7"_B2A G2F|"Em"EEE E2G|\
    "C7"_B2A "B7"=B3|"Em"EEE E2G|
    "C7"_B2A G2F|"Em"GFE "D (Bm7)"F2D|\
    1"Em"E3-E3:|2"Em"E3-E2B|:"Em"e2e gfe|
    "G"g2ab3|"Em"gfeg2e|"D"fedB2A|"Em"e2e gfe|\
    "G"g2ab3|"Em"gfe"D"f2d|"Em"e3-e3:|
    

    可在首行加入 %%params JSON​ ,使 JSON​ 作为 renderAbc options​ 的参数。

    语法请参考 abcjs (github repo: paulrosen/abcjs)。

    Graphviz

    digraph finite_state_machine {
        rankdir=LR;
        size="8,5"
        node [shape = doublecircle]; S;
        node [shape = point ]; qi
    
        node [shape = circle];
        qi -> S;
        S  -> q1 [ label = "a" ];
        S  -> S  [ label = "a" ];
        q1 -> S  [ label = "a" ];
        q1 -> q2 [ label = "ddb" ];
        q2 -> q1 [ label = "b" ];
        q2 -> q2 [ label = "b" ];
    }
    

    语法请参考 Graphviz

    Flowchart

    st=>start: Start
    op=>operation: Your Operation
    cond=>condition: Yes or No?
    e=>end
    
    st->op->cond
    cond(yes)->e
    cond(no)->op
    

    语法请参考 flowchart.js

    PlantUML

    @startuml component
    actor client
    node app
    database db
    db -> app
    app -> client
    @enduml
    

    语法请参考 PlantUML↩︎

  14. 优化排版

    概述

    为了快速记录内容,我们时常会忽略一些排版细节,比如行级代码前后或者加粗前后缺少空格、中文和西文之间缺少空格。

    这样会导致内容排版看上去不够精致,以后浏览该内容时也有一定视觉干扰。当然,这只是我们的感触,也许这并不是问题,甚至本来就需要这样紧凑排版。

    使用方式

    在编辑器右上角 ... 菜单中选择 优化排版,处理完成后文档中的如下元素前后会被自动插入一个空格:

    • 行级代码:Code
    • 行级公式:$a^2 + b^2 = \color{red}c^2$

    另外,如下元素中的中西文间也会自动插入一个空格:

    自动备份

    在实际执行优化排版之前,思源会自动备份一次原有的文档,这样如果优化结果不满意也能够通过数据历史[36:1]进行回滚。 ↩︎ ↩︎

  15. 通过标题列表概述

    这是通过融合标题和列表进行概述的示例。

    • 列表项 1

      标题 2

      一个简单的段落。

      引述

      • 引述中的列表项

        • 子列表项 1
        • 子列表项 2
      • 子列表项 1
      • 子列表项 2
    • 列表项 2

      1. 有序列表项 1

        package main
        
        import "fmt"
        
        func main() {
        	fmt.Println("Hello, 世界")
        }
        
      2. 有序列表项 2

    ↩︎
  16. 查询语法

    概述

    全局搜索 Ctrl+P 支持通过查询语法(Query Syntax)进行高级搜索,以便实现一些逻辑操作,比如包含关键字 foo 并且不包含关键字 bar 的查询语法为 foo NOT bar

    在使用查询语法之前,我们先大致了解一下该语法的构成:

    • 字符串(String):由字母、数字等构成
    • 短语(Phrase):由字符串构成
    • 查询(Query):由短语构成,多个查询可通过 ANDORNOT 组合为新的查询

    下面我们分别介绍它们的细节。

    字符串

    字符串可由两种方式指定:

    • 通过英文双引号 " 包裹起来的字符。其中如果需要使用 " 本身,则可通过 SQL 风格转义(再加一个"),例如 "foo""bar""" 将搜索命中 foo"bar"

    • 由非 ANDORNOT 字符组成,并且这些字符必须是:

      • 所有非 ASCII 字符,或者
      • 属于 52 个大小写英文字符(A-Za-z),或者
      • 属于 10 个 ASCII 数字字符(0-9),或者
      • 是下划线 _,或者
      • 是替换符(ASCII 26)

    对于非上述的其他字符构成的字符串,必须使用 " 包裹起来,比如包含了 -* 等符号的字符串。

    短语

    短语由字符串构成,可由 +​ 进行连接。一个短语是由一些记号(Token)有序构成,这些记号由用户的输入文本通过分词器处理得到。思源使用的分词器为了让中文搜索好用(支持单字搜索),所以实现方式是按照字分词的,也就是说每个汉字或者英文字母都会被拆分为一个记号。这对 +​ 连接会产生一些影响,所以如果不确定的话,建议不要使用 +​ 组合多个短语。

    查询

    查询由多个短语构成,可通过操作符 ANDORNOT 组合为新的查询。

    操作符 功能
    <query1> AND <query2> query1 和 query2 同时匹配
    <query1> OR <query2> query1 或者 query2 匹配
    <query1> NOT <query2> query1 匹配同时 query2 不匹配

    使用英文圆括号 () 可以组合查询的优先级,例如:

    -- 匹配包含 "one" 或者 "two" 的块,不匹配包含 "three" 的块
    'one OR two NOT three'
    
    -- 匹配包含 "one" 或者包含 "two" 且不包含 "three" 的块
    'one OR (two NOT three)'
    

    使用空格分隔的多个短语默认使用 AND 连接,比如:

    'one two three'         -- 'one AND two AND three'
    'three "one two"'       -- 'three AND "one two"'
    'one OR two three'      -- 'one OR two AND three'
    
    '(one OR two) three'    -- 语法错误!
    'func(one two)'         -- 语法错误!
    

    技术实现

    我们通过 SQLite FTS5 实现了全局搜索。

    系统生成的查询语句关键部分大致是 MATCH '{content name alias memo}:" + queryquery 即用户输入部分,对于列过滤器 {content name alias memo}: 是通过 设置 - 搜索 - 属性 生成的。

    了解到这些以后,我们就可以通过查询语法来实现查询嵌入块,这样查询性能会更好:

    全局搜索 Ctrl+P 支持通过查询语法(Query Syntax)进行高级搜索,以便实现一些逻辑操作,比如包含关键字 foo 并且不包含关键字 bar 的查询语法为 foo NOT bar

    除此以外,API 也支持使用 FTS 查询。

    大小写敏感

    如果开启了 设置 - 搜索 - 区分大小写 选项,则搜索会区分大小写,默认该选项是关闭的,即不区分大小写。

    由于分词器是区分大小写的,所以我们构建了两张虚拟表来分别索引:

    • blocks_fts:按字符原样分词
    • blocks_fts_case_insensitive:将英文字母转换为小写分词

    这样做的缺点是增加了磁盘空间占用和降低了索引性能,但是目前暂时没有更好的方案,所以只能先这样了。另外,不支持变音符号,仅支持忽略大小写。

    如果你有更好的实现方案,欢迎告诉我们,非常感谢。 ↩︎

  17. 数据库表

    blocks

    该表用于存储内容块数据。

    字段 说明
    id 内容块 ID
    parent_id 父块的 ID,如果内容块是文档块则该字段为空
    root_id 根块 ID,即文档块 ID
    hash content 的 SHA256 校验和
    box 笔记本 ID
    path 内容块所在文档路径
    hpath 人类可读的内容块所在文档路径
    name 内容块名称
    alias 内容块别名
    memo 内容块备注
    content 去除了 Markdown 标记符的文本
    fcontent 第一个子块去除了 Markdown 标记符的文本
    markdown 包含完整 Markdown 标记符的文本
    length fcontent​ 长度
    type 内容块类型,参考这里[^44]
    subtype 内容块子类型,参考这里[^45]
    ial 内联属性列表,形如 {: name="value"}
    sort 排序用,数值越小排序越靠前
    created 创建时间,例如 20221013202001
    updated 更新时间,例如 20221013202001

    默认值

    • 如果不指定 LIMIT,则最多只返回前 64 条结果,可以在 设置 - 搜索 - 搜索结果显示数 进行调整

    • sort​ 字段

      • 标题块:5
      • 段落块:10
      • 代码块:10
      • 数学公式块:10
      • 表格块:10
      • HTML 块:10
      • 列表块:20
      • 列表项块:20
      • 引述块:20
      • 超级块:30
      • 数据库块:30
      • 文档块:0
    ↩︎
  18. 类型过滤

    类型字段 type

    • d​ 文档块(仅在文档名上搜索,不会搜索文档包含内容块)
    • h​ 标题块(仅在标题名上搜索,不会搜索标题块下方内容块)
    • l​ 列表块(包含有序列表块、无序列表块和任务列表块)
    • i​ 列表项块
    • b​ 引述块
    • s​ 超级块
    • p​ 段落块
    • c​ 代码块
    • m​ 公式块
    • t​ 表格块
    • av​ 数据库块
    • query_embed​ 嵌入块
    • video​ 视频块
    • audio​ 音频块
    • widget​ 挂件块
    • iframe​ IFrame 块
    • html​ HTML 块
    • tb​ 分隔线

    子类型字段 subtype

    列表块/列表项块子类型:

    • o:有序
    • u:无序
    • t:任务

    标题块子类型:

    • h1:一级
    • h2:二级
    • h3:三级
    • h4:四级
    • h5:五级
    • h6:六级

    其他类型的内容块没有子类型。 ↩︎

  19. 忽略索引

    概述

    忽略索引指的是不将文档数据编入数据库,这样数据将完全无法搜索到,并且减小数据库大小。

    使用方式

    在文件系统上手动创建或编辑 工作空间/data/.siyuan/indexignore​ 文本文件,其中每一行作为一个忽略路径,支持 gitignore 语法。例如:

    20210808180117-6v0mkxr/20200923234011-ieuun1p.sy
    20210808180117-6v0mkxr/**/*
    
    • 20210808180117-6v0mkxr/20200923234011-ieuun1p.sy​:忽略 data/20210808180117-6v0mkxr 笔记本下的 20200923234011-ieuun1p.sy​ 文档编入索引
    • 20210808180117-6v0mkxr/**/*​:忽略 data/20210808180117-6v0mkxr 笔记本下的所有文档编入索引

    配置文件修改保存后需要手动重建索引。 ↩︎

  20. 忽略搜索

    概述

    忽略搜索指的是在搜索时过滤掉某些不需要的结果。

    使用方式

    忽略全局搜索和忽略引用搜索需要分开配置:

    • 忽略全局搜索:在文件系统上手动创建或编辑 工作空间/data/.siyuan/searchignore​ 文本文件
    • 忽略引用搜索:在文件系统上手动创建或编辑 工作空间/data/.siyuan/refsearchignore​ 文本文件

    这些 ignore 配置文件中的每一行会被作为 SQL path NOT LIKE 的一个条件,例如:

    path NOT LIKE '/20210808180117-6v0mkxr%'
    box != '20210808180117-czj9bvb'
    id != '20200923234011-ieuun1p'
    
    • path NOT LIKE '/20210808180117-6v0mkxr%'​:忽略所在文档路径以 ​/20210808180117-6v0mkxr 开头的内容块搜索
    • box != '20210808180117-czj9bvb'​:忽略 data/20210808180117-czj9bvb 笔记本下的内容块搜索
    • id != '20200923234011-ieuun1p'​:忽略 id 为 20200923234011-ieuun1p 的内容块搜索

    配置文件修改保存后需要等待 30 秒才会生效。 ↩︎

  21. 图标

    概述

    图标包可以从社区集市下载或者手动安装。

    社区集市

    • 设置​ - 外观​ - 集市​ - 图标​ 中在线浏览社区开发者贡献的图标
    • 选择所需图标在线安装或者更新

    手动安装

    1. 获取图标并解压
    2. 设置 - 外观 - 图标 - 打开图标文件夹
    3. 将图标拷贝到该文件夹中
    4. 重启后在 设置 - 外观 - 图标 中选择安装好的图标

    开发

    步骤

    1. 为你的图标取一个好听的名字,如 alice
    2. 设置 - 外观 - 图标 - 打开图标文件夹
    3. 在打开的文件夹中新建文件夹 alice​,在 alice​ 中新建 icon.js​ 和 icon.json​ 文件icon.json​,具体示例请参考 github repo: siyuan-note/icon-sample
    4. 打开 icon.js 文件,贴入制作完成的图标
    5. 重启 设置 - 外观 - 图标 中选择安装好的图标

    图标的制作

    • 使用浏览器打开图标文件夹中的 index.html​ 文件

    • 根据图标名称和形状制作相似的图标

      • 前往 Iconfont 搜索中意的图标,下载 SVG 格式
      • 使用矢量图工具自行制作 SVG 格式的图标
      • 前往 pngtosvg 将图片转换为 SVG 格式
    • 前往 IcoMoon App 制作 icon.js

      • 点击右上角的 Import Icons​ 导入上一步制作好的图片
      • 选中图标并生成 SVG
        custom-icon1.png
      • 修改大小并下载
        custom-icon2.png
      • 修改 <symbol id="iconMarkdown" viewBox="0 0 32 32">​ 中的 id​ 为 index.html​ 对应的图标名
      • 将 ​<defs>...</defs>​ 中的内容替换到 icon.js​ 中对应的位置
    • 测试

      • index.html​ 中 material​ 替换为 alice

        <script src="material/icon.js"></script>
        
      • 刷新 index.html​ 查看最终效果

      • 打开思源在 设置 - 外观 - 图标 中选择开发完成的图标进行查看

    上架图标集市

    请参考社区集市仓库↩︎ ↩︎

  22. 主题

    概述

    有两种方式自定义主题:

    • 代码片段
    • 主题包

    代码片段

    1. 打开 设置​ - 外观​ ,点击 代码片段设置​,选中 CSS 页签

    2. 填入标题

    3. 根据主题和 theme.css 中的变量参照如下写法进行编码后填入代码片段中

      html[data-light-theme="daylight"][data-theme-mode="light"] {
          --b3-theme-primary: red;
      }
      
      html[data-light-theme="daylight"][data-theme-mode="dark"] {
          --b3-theme-primary: blue;
      }
      
    4. 开启该代码片段

    5. 点击确定按钮

    主题包

    主题包可以从社区集市下载或者手动安装。

    社区集市

    • 设置​ - 外观​ - 集市​ - 主题​ 中在线浏览社区开发者贡献的主题
    • 选择所需主题在线安装或者更新

    手动安装

    1. 从某处获取主题并解压
    2. 设置 - 外观 - 主题 - 打开主题文件夹
    3. 将主题拷贝到该文件夹中
    4. 重启后在 设置 - 外观 - 主题 中选择所需主题

    开发

    步骤

    1. 为你的主题取一个好听的名字,如 alice
    2. 设置 - 外观 - 主题 - 打开主题文件夹
    3. 在打开的文件夹中新建文件夹 alice​,在 alice​ 中新建 theme.css​ 和 theme.json​ 文件,具体示例请参考 github repo: siyuan-note/theme-sample
    4. 打开 theme.css 文件,开启你的编码旅程
    5. 重启后在 设置 - 外观 - 主题 中选择安装好的主题

    编码

    • 熟悉 CSS 基础知识
    • 修改 :root{...} 中的配色。⚠️ 不可删除官方中原有的变量项
    • 按照图中 1-4 步不断进行修改
      custom-theme1.png
    • 将修改后的内容复制贴入 theme.css 中并保存
    • Network 中勾选 Disable cache 后运行 window.location.reload() 以查看最终效果
      custom-theme2.png

    上架主题集市

    请参考社区集市仓库↩︎ ↩︎

  23. 工作空间

    概述

    工作空间用于保存数据、历史、配置和运行时所需要的文件。

    • 不同工作空间通过文件系统文件夹相互隔离
    • 一个工作空间只能被一个内核进程伺服

    切换工作空间

    • 桌面端可以在顶栏左侧下拉菜单中打开多个工作空间

      如果你的多个工作空间需要经常启动,可以考虑为每个工作空间创建不同的启动入口并指定启动参数 --workspace=工作空间绝对路径​。比如 Windows 系统上可以复制多个快捷方式,并在每个快捷方式 - 属性 - 目标后跟随工作空间路径参数,例如 --workspace=F:\SiYuan​。除此以外,还可以通过 --port=12345​ 来指定内核监听的端口。

    • 移动端可以在右侧栏 关于​​ 中切换不同的工作空间

    文件系统结构

    文件系统上工作空间下的结构:

    • conf​ 用于保存工作空间配置
    • corrupted​ 用于保存已经损坏的数据文件
    • data​ 用于保存数据,具体结构请参考这里[^13]
    • history​ 用于保存文件历史
    • repo​ 用于保存数据仓库数据
    • temp​ 用于保存运行时所需的临时文件
    • .lock​ 内核进程启动后会创建该文件,用于锁定工作空间
    ↩︎ ↩︎
  24. 导入和导出

    导入

    Markdown

    思源支持导入 Markdown 文件。所以如果你需要导入其他笔记软件的数据,请先将数据转换为 Markdown 文件。

    导入时如果遇到形如 ![foo](images/bar.png)​ 的图片语法(本地相对路径),则思源会将 images/bar.png​ 转换为资源文件[31:2]。但是如果是 .images/bar.png​ 则不会转换,因为 .​ 开头的路径文件属于隐藏文件,思源不会进行处理。

    如果需要识别一些扩展语法(比如 上标 ^foo^​、下标 ~foo~​、标签 #foo​ 和公式 $foo$​ 等),请打开 设置​ - 编辑器​ - Markdown 语法​ 相关开关。

    Data

    在桌面端 设置 - 导出、移动端右侧栏 关于 中可以进行数据导入和导出。这里的导出会将 工作空间/data/ 文件夹完整复制并打包为 zip 压缩包。

    导入 Data 功能仅支持处理以上步骤导出的 Data 压缩包。导入按压缩包中的文件路径复制到当前 工作空间/data/ 文件夹:

    • 重复的文件进行覆盖
    • 不存在的文件进行新增
    • 已有的文件不做任何处理

    注意#:使用前请务必留意,避免已有数据被覆盖无法恢复。

    导出

    编辑内容复制

    选择内容后使用复制快捷键 Ctrl+C 即可,剪切板中是标准 Markdown 文本。

    如果你需要复制 HTML 内容,请在编辑器页签右上角的 ... 菜单中的 模式切换 切换到 导出预览 后再进行复制。

    全文导出

    在文档树上选择文档后右键选择 导出 或者编辑器页签右上角的 ... 菜单中选择 导出

    • Markdown
    • PDF
    • HTML
    • Word .docx

    设置 - 导出 中有一些选项可以进行导出处理配置,细节请参考该界面上的提示信息。 ↩︎

  25. 剪藏

    概述

    “剪藏”是指将 Web 页面上的内容复制到思源中,并尽量保持其原始格式。

    使用方式

    • 如果不需要将剪藏内容中包含的图片拉取到本地,可直接在浏览器中选择复制,然后在思源中进行粘贴
    • 如果需要将剪藏内容中包含的图片拉取到本地,可使用思源 Chrome 扩展

    思源 Chrome 扩展

    1. 安装扩展,在扩展的选项中配置 API token(token 可在思源设置 - 关于中查看)
    2. 在 Web 页面上选择需要剪藏的内容,然后在右键菜单中选择 “Copy to SiYuan”
    3. 在思源中粘贴

    如果需要剪藏整篇文章,可在扩展上直接点击“Send to SiYuan”。

    移动端剪藏

    如果需要在手机上进行剪藏,请使用收集箱[51:2]↩︎

  26. 日记

    我们可以通过日记来快速创建文档,日记功能入口在顶部主菜单中。

    使用日记前,需要在笔记本右键菜单中打开 设置​ ,在新建日记设置中配置:

    • 存放路径:笔记本下的路径,支持模板变量[^64]
    • 模板路径(可选):创建日记时使用该模板作为初始内容

    小提示:在指定的模板使用嵌入内容块[11:2],可以汇总待办事项或者需要每日查看的内容块。 ↩︎

  27. 书签和标签

    书签

    如果你需要“收藏”内容块,请通过块标菜单打开属性面板,然后就可以在属性面板中设置书签了。

    所有收藏过的内容块会在书签页签( Alt+3​ / ⌃3​)中列出。如果要取消收藏,在该内容块标识下拉菜单中选择删除即可。

    标签

    标签用于在内容块中对该块进行标记。语法是通过一前一后两个 # 将标签标识包裹起来,像这样 #标签#

    标签支持层级,这样可以更方便地对内容块进行分类整理。不同层级之间使用 / 分隔,像这样 #A/B/C#

    所有打过标签的内容块会在标签页签(Alt+4​ / ⌃4​)中列出。如果需要取消标签,在内容块中删掉该标签即可。

    #注意#​

    请勿在书签或者标签中使用特殊符号,否则会导致无法全局搜索,也无法在书签/标签面板中重命名和删除。这里的“特殊符号”包括:*​、_​、[​、]​、!​、\​、`​、<​、>​、&​、~​、$​、(​、)​、{​、}​、=​ 和 #​。 ↩︎

  28. 数据库

    概述

    数据库由内容块或者非内容块数据组成,并以不同视图呈现,比如表格视图和看板视图(看板视图还在开发中)。

    表格视图

    • 通过 /数据库​ 创建,默认视图即表格视图

    • 添加不同类型的属性

    • 添加行

      • 非内容块:直接在表格中添加的行,不绑定到任何内容块
      • 内容块:通过拖拽到表格添加的行,或者通过块标菜单 添加到数据库​ 添加的行
    • 按需设置过滤和排序

    • 同一个数据库可以添加多个视图,所有视图共享相同的数据,但过滤和排序设置相互独立

    镜像数据库

    复制数据库块后粘贴将形成镜像数据库,即这些数据库块共享相同的数据库数据,修改任何一个数据库块的数据会同步到其他所有镜像中。

    关联和汇总

    两个数据库之间可以通过 关联​ 建立联系,以便联动管理。比如 作者​ 和 书籍​ 两个数据库之间的关联:

    作者名 作品 作品数
    儒勒·凡尔纳 海底两万里 1
    刘慈欣 流浪地球, 三体 2
    书名 类型 作者
    海底两万里 科幻 儒勒·凡尔纳
    三体 科幻 刘慈欣
    流浪地球 科幻 刘慈欣

    作者​ 数据库中 作品数​ 汇总对其 作品​ 进行了汇总统计,统计方式是 行计数​。

    模板

    模板可通过模板片段[32:2]中介绍的语法访问、计算并渲染同一条数据中其他属性的值:

    • 使用 .action{ .属性名 }​ 访问视图属性
    • 使用 .action{ index . "custom-xxx" }​​ 访问内容块自定义属性

    比如下面的 账单​ 数据库 模板​ 属性演示了 餐饮​ 和 服装​ 求和:

    成员 餐饮 服装 模板
    Vanessa 200 200 400
    Daniel 100 100 200

    #注意#​

    如果需要在数据库单元格中换行,请使用 Shift+Enter​ 。 ↩︎

  29. 挂件

    概述

    挂件是思源内核伺服的静态网页,它通过 API 存取数据,通过 <iframe>​ 进行渲染展现。

    相较于插件[30:2]而言,挂件是一种内容块,遵循块的索引和渲染规则,挂件主要面向内容块扩展,不面向程序功能扩展。

    使用方式

    挂件通过挂件集市安装,安装后挂件将被放置到 工作空间/widgets/​ 文件夹下。在编辑器中使用斜杆菜单触发调用搜索,选择需要的挂件后该挂件就会以挂件块的形式插入到文档中。

    上架挂件集市

    请参考社区集市仓库↩︎ ↩︎ ↩︎ ↩︎

  30. 插件

    概述

    插件主要用于扩展思源整体功能。

    相较于挂件[29:2]而言,插件主要面向程序功能扩展,不面向内容块扩展。

    使用方式

    插件通过插件集市安装,安装后插件将被放置到 工作空间/plugins/​ 文件夹下,你可以在 插件集市​ - 已下载​ - 插件​ 中启用或禁用插件。

    上架插件集市

    请参考社区集市仓库↩︎ ↩︎ ↩︎ ↩︎

  31. 资源文件

    概述

    通过编辑器插入的附件会被认为是资源文件,默认放置在 工作空间/data/assets/ 文件夹下。

    插入图片或文件

    在编辑器中可以直接粘贴系统剪切板中复制好的图片或文件(Linux 端不支持),或者通过拖拽图片或文件到编辑器中也可以实现插入。插入时有两个选择:

    • 复制为资源文件并插入:将图片或文件复制为资源文件并插入,快捷键 Ctrl+V
    • 使用 file:// 绝对路径并链接:将图片或文件以本地绝对路径方式插入超链接,快捷键 Ctrl+Shift+V,或者按住 Alt 后拖入

    对于图片,如果排版时指定了图片标题,则标题会被渲染在图片下方作为图注。

    siyuan-128.png

    ​#注意#​:插入图片不会进行压缩处理,所有图片和文件都以原始数据进行保存。

    清理未引用资源

    “引用”指的是通过超链接、插入图片或者 HTML 标签(例如 <img><iframe>)的属性 src 对资源文件进行链接。这里分为两种情况:

    1. 引用具体的资源文件,比如图片或者文件
    2. 引用资源文件夹(在 assets 文件夹下的子文件夹),必须以 / 结尾,比如 [foo](assets/bar/)。一个资源文件夹如果被引用,则下面所有资源文件无论是否被单独引用,都会被算作已经引用

    设置​ - 资源​ 中可以一键清理未引用资源,如果需要找回被误删的文件,请通过回滚[^15]。

    ​#注意#​:使用绝对路径(本地路径或者是网络路径)不会纳入清理计算。

    查看丢失资源

    设置​ - 资源​ 中可以查看丢失的资源,复制路径后可以在全局搜索中找到引用处。

    ​#注意#​:搜索资源文件路径需要先启用 设置​ - 搜索​ - 索引​ - 资源文件路径​。

    笔记本级资源文件

    如果需要默认将插入的资源文件放置在文档同级 assets 文件夹下,则需要先手动创建名为 assets 的文件夹,这样思源会优先选择该 assets 文件夹来存放资源文件。

    建议尽量不要使用笔记本级资源文件,因为这会带来一些副作用:

    • 删除该笔记时,为保证跨笔记本资源文件引用正常工作,该笔记引用的资源文件会被批量复制到全局 assets 中
    • 不支持在数据历史中查看笔记本级资源文件历史
    • 不支持使用 /资源 搜索
    • 不支持重命名

    图片 OCR 提取文本

    该特性仅在桌面端支持,并且需要先手动安装 Tesseract OCR 程序。

    ​#注意#​:

    • 在安装 Tesseract OCR 时需要勾选你需要的语言包,并将安装后的 Tesseract-OCR 目录路径添加到环境变量 PATH​ 中,这样思源才能直接调用 tesseract​ 命令进行图片 OCR 提取文本。如果安装正常的话,在内核启动日志中可以搜索到 tesseract-ocr enabled​;如果要禁用 OCR,请设置环境变量 SIYUAN_TESSERACT_ENABLED=false
    • 思源并不会启用所有已安装的语言包,因为语言包太多的话会导致 OCR 缓慢甚至超时返回空结果,并且占用过多的系统资源,所以默认最多只会启用 eng​、chi*​、fra​、spa​、deu​、rus​ 和 osd​,如果你需要更准确的语言支持,可以通过配置环境变量 SIYUAN_TESSERACT_LANGS​ 来指定语言包,比如 SIYUAN_TESSERACT_LANGS=chi_sim+eng
    • 仅支持 png 和 jpg 格式的图片
    • 默认只对 2MB 以下的图片进行处理,如果需要调整,可以通过环境变量 SIYUAN_TESSERACT_MAX_SIZE​ 设置,值的单位是字节,比如:SIYUAN_TESSERACT_MAX_SIZE=4000000​ 将上限调整为 4MB

    图片 OCR 提取文本过程是自动在后台进行的,目前仅支持 PNG、JPG 图片。提取的文本会被用于搜索功能,这样就能通过文本关键字来定位图片。

    手动调整 OCR 结果

    OCR 的结果保存在 工作空间/data/assets/ocr-texts.json​ 中,可通过下面的方式调整 OCR 结果:

    • 退出思源后在文件系统上修改该文件(请注意 JSON 格式的正确性)
    • 或者在编辑器中的图片元素菜单中选择 OCR

    调整完以后需要手动重建索引。 ↩︎ ↩︎ ↩︎

  32. 模板片段

    概述

    模板片段用于在光标插入符位置快速插入之前设置好的文本内容,支持变量。模板片段使用 .md 后缀文件,存放在工作空间 data/templates 文件夹下。

    编写模板

    模板使用的是 Go 编程语言的文本模板进行实现,如果你对此有了解的话,可以实现一些程序逻辑在里面,比如比较逻辑、迭代逻辑等。另外,为了避免语法冲突,模板语法使用 .action{action}(而不是 {{action}})。

    我们通过开源项目 Sprig (GitHub repo: Masterminds/sprig) 内置了一些变量和函数来丰富模板。比如可通过 .action{now | date "2006-01-02 15:04:05"}​ 来渲染当前时间,更多用法请参考 Sprig 帮助文档中文版)。

    关于日期时间格式化有个细节需要#注意#:Go 编程语言的格式化比较特殊:不是使用 yyyy-MM-dd HH:mm:ss,而是使用 2006-01-02 15:04:05 这个固定时间格式(知乎讨论)。

    除了 Sprig 内置的变量和函数,还支持如下变量和函数:

    • title​:该变量用于插入当前文档名。比如模板内容为 # .action{.title}​,则调用后会以一级标题语法插入到当前文档内容中
    • id​:该变量用于插入当前文档 ID
    • name​:该变量用于插入当前文档命名
    • alias​:该变量用于插入当前文档别名
    • getHPathByID​:该函数用于返回块 ID 对应块的可读路径
    • queryBlocks​:该函数用于查询数据库,返回值为 blocks 列表,请参考下面的例子
    • querySpans​:该函数用于查询数据库,返回值为 spans 列表,请参考下面的例子
    • parseTime​:该函数用于将时间格式的字符串解析为 time.Time​ 类型,以便使用更多格式化方法渲染该时间
    • Weekday​:该函数用于返回周几 Sunday=0, Monday=1, ..., Saturday=6
    • WeekdayCN​:该函数用于返回周几 Sunday=日, Monday=一, ..., Saturday=六
    • WeekdayCN2​:该函数用于返回周几 Sunday=天, Monday=一, ..., Saturday=六
    • ISOWeek​:该函数用于返回第几周
    • pow​:指数计算,返回整数
    • powf​:指数计算,返回浮点数
    • log​:对数计算,返回整数
    • logf​:对数计算,返回浮点数

    queryBlocksquerySpans 支持类似 SQL 预编译语句的变参列表,方便传入参数:

    .action{$today := now | date "20060102150405"}
    .action{$blocks :=queryBlocks "SELECT * FROM blocks WHERE content LIKE '?' AND updated > '?' LIMIT ?" "%foo%" $today "3"}
    

    调用模板

    在光标插入符位置,通过 / 选择模板来触发模板搜索,找到需要插入的模板后回车即可。

    一个示例

    .action{$before := (div (now.Sub (toDate "2006-01-02" "2020-02-19")).Hours 24)}
    
    .action{$after := (div ((toDate "2006-01-02" "2048-02-19").Sub now).Hours 24)}
    今天是 `.action{now | date "2006-01-02"}`。
    
    * 距离 `2020-02-19` 已经过去 `.action{$before}` 天
    * 距离 `2048-02-19` 还剩 `.action{$after}` 天
    

    $before$after 定义了两个变量,分别记录当前日期距离 2020 年和 2048 年的天数。

    上架模板集市

    请参考社区集市仓库↩︎ ↩︎ ↩︎ ↩︎

  33. PDF 标注

    插入 PDF 资源文件

    将 PDF 文件通过编辑器上传插入以后,PDF 将放到 assets 文件夹下,并在文档内生成形如 [filename](assets/filename.pdf) 的链接。点击该链接可使用思源进行预览。

    超链接页码跳转

    新页签打开预览 PDF 支持指定页码,需要将链接带上参数 page,例如需要跳转到第七页,则将链接编辑为 [filename](assets/filename.pdf?page=7)

    标注

    PDF 预览时可使用划选进行标注,标注可复制到文档中形成链接:

    • 在文档中点击引用链接可以打开 PDF 并跳转到标注
    • 在 PDF 中鼠标悬浮标注可预览引用标注的块
    ↩︎
  34. 虚拟引用

    概述

    虚拟引用是一种根据已有块链的锚文本或者块命名等来自动探测的“块链”,但它并不会真实链接到块上,而是仅在编辑器内标记,并支持浮窗预览。

    使用方式

    打开 设置 - 编辑器 - 虚拟引用 开关即可。

    探测规则

    根据已有块引的锚文本/定义块文本、块的命名和别名作为关键字搜索,如果在当前内容块的纯文本元素上搜索到这些关键字,那么就会作为虚拟引用。

    可在 设置​ - 搜索​ - 虚拟引用​ 中调整关键字搜索范围。

    #注意#

    • 出于性能考虑,虚拟引用并不是即时生效的,如果没有显示,可以尝试通过 F5​ 刷新当前文档
    ↩︎
  35. 超链接

    概述

    如果你需要在其他地方(比如浏览器或者支持超链接跳转的软件)拉起思源桌面端应用程序,可以使用 siyuan:// 超链接。

    链接格式

    siyuan://blocks/{id}:直接打开内容块,需要该块所在笔记本已经处于打开状态。

    加入查询字符串参数 focus=1siyuan://blocks/{id}?focus=1)表示聚焦打开。

    使用方式

    • 在 Windows 和 macOS 上启动后会自动向系统申请注册 siyuan:// 协议

    • 在 Linux 上请尝试如下步骤

      • 创建或者找到 siyuan.desktop 文件,并打开编辑

        • MimeType=MimeType=x-scheme-handler/siyuan;
        • Exec 末尾加入 %u,即 Exec=可执行文件路径 %u
      • 执行以下命令

        sudo update-desktop-database
        xdg-mime default siyuan.desktop x-scheme-handler/siyuan
        xdg-settings set default-url-scheme-handler siyuan siyuan.desktop
        

        更多细节可参考 xdg-utils

    • 块标菜单 - 复制 - 复制块超链接

    ↩︎
  36. 数据历史

    概述

    数据历史主要用于保证数据安全,即使发生误操作也能通过历史进行数据回滚。数据历史分为两个功能:

    • 文件历史:按原始文件方式保存在 工作空间/history/ 文件夹下,人类可读,可手动拷贝到 data 对应位置恢复
    • 数据快照:按文件分块、加密并压缩保存在 工作空间/repo/ 文件夹下,人类不可读,无法手动恢复

    数据快照除了用于本地数据历史,还用于云端数据同步[48:2]

    文件历史

    文件历史生成规则

    • 每隔 10 分钟会对这 10 分钟内更新过的文档生成历史(间隔时间可通过 设置​ - 编辑器​ - 历史生成间隔​ 进行调整),历史文件夹后缀为 -update
    • 云端同步时,本地被云端覆盖的数据会生成历史,历史文件夹后缀为 -sync
    • 手动删除笔记本、文档和资源文件时会生成历史,历史文件夹后缀为 -delete
    • 使用清理未引用资源[^52]时会生成历史,历史文件夹后缀为 -clean
    • 使用优化排版[14:1]时会生成历史,历史文件夹后缀为 -format
    • 使用 搜索替换​ 时会生成历史,历史文件夹后缀为 -replace
    • 在大纲面板拖拽大纲项目时会生成历史,历史文件夹后缀为 -outline

    浏览文件历史

    • 点击顶部工具栏 数据历史 按钮或者 Alt+H 可打开数据历史界面,切换到 文件历史 页签,如果没有历史数据显示,可以试下该界面的 重建索引
    • 在文件系统 工作空间/history/ 文件夹下浏览

    通过文件历史回滚

    在数据历史界面左侧时间列表栏中,每一条历史记录右侧都有一个回滚按钮,点击以后将弹出确认对话框,如果确认回滚的话将使用文件历史覆盖现有文件。

    如果有非常多的文件需要回滚,建议手动在文件系统上复制。历史文件夹的内部结构和 data 内部结构一致,比如:

    • 笔记本删除:2022-05-01-091021-delete/20210808180117-czj9bvb/,即 历史生成日期-{操作}/{笔记本 ID}/
    • 文档删除:2022-05-01-091209-delete/20210808180117-czj9bvb/20200812220555-lj3enxa.sy,即 历史生成日期-{操作}/{笔记本 ID}/{文档路径}
    • 资源文件清理:2022-05-01-095621-clean/assets/image-20220501091157-qccp87e.png,即 历史生成日期-{操作}/assets/{资源文件名}

    手动回滚操作步骤:

    1. 退出思源,然后全量复制备份一下整个工作空间,避免后续误操作导致数据丢失
    2. 进入 工作空间/history/ 文件夹,将 历史生成日期-{操作} 文件夹下的数据直接复制到 data 文件夹进行覆盖
    3. 启动思源后手动执行重建索引

    清理文件历史

    默认自动保存最近 30 天生成的文件历史,可通过 设置 - 编辑器 - 历史保留天数 进行调整,超过该期限的文件历史会被自动删除。

    如果你想清空所有文件历史数据,可以点击 设置 - 编辑器 - 清空所有历史,或者手动删除 工作空间/history/ 文件夹,然后在 文件历史重建索引

    数据快照

    初始化密钥

    第一次使用数据快照前需要在 设置 - 关于 中初始化 数据仓库密钥

    初始化密钥有三种方式:

    • 导入密钥:将其他设备上的密钥字符串复制到此粘贴导入
    • 自动生成密钥:使用随机数生成密钥,该方式只需在一台设备上执行一次,其他设备使用 导入密钥
    • 通过密码生成密钥:使用自定义的密码短语生成密钥,该方式需要在所有设备上都使用相同的密码短语

    总而言之,请务必保证所有设备都使用相同的密钥,否则数据快照将无法跨设备使用,比如无法通过云端同步数据快照。

    创建数据快照

    1. 点击顶部工具栏 数据历史 按钮或者 Alt+H 可打开数据历史界面
    2. 切换到最后一个页签 数据快照
    3. 点击 创建快照,填写 备注 并确认

    浏览数据快照时只能通过快照创建时间和备注进行区别,所以备注信息应该尽量详细一些,以备后续能够准确识别不同的数据快照。

    浏览数据快照

    创建完数据快照后可以在左侧看到快照时间列表,点击不同快照以后可以浏览其备注。

    回滚数据快照

    在快照时间列表条目右侧都有一个回滚按钮,点击以后将弹出确认对话框,如果确认回滚的话将使用快照数据完全替换现有数据。

    清理数据快照

    • 设置​ - 关于​ - 数据仓库清理​ 将删除所有未引用的快照和相关数据对象。“引用的快照”指的是 repo/refs/ 下指向的快照:

      • latest​ 指向最新一个快照
      • tags/*​ 指向手动标记的快照
    • 手动删除 工作空间/repo/​​ 文件夹可以清空全部数据快照

    忽略文件

    如果需要在创建快照时忽略一些文件,请在文件系统上创建或编辑文本文件 工作空间/data/.siyuan/syncignore​, 其中每一行使用 data 文件夹的相对路径进行配置,表示忽略文件或文件夹的路径,支持通配符。例如:

    • 20210808180117-6v0mkxr/**/*: 忽略 data/20210808180117-6v0mkxr 笔记本
    • assets/*.pdf:忽略 data/assets/ 下的 PDF 文件

    #注意#

    • 符号链接和隐藏文件不会被快照
    ↩︎ ↩︎
  37. 闪卡

    概述

    将内容块设置为闪卡后会自动通过间隔重复算法 FSRS (github repo: open-spaced-repetition/free-spaced-repetition-scheduler) 安排复习。

    使用方式

    内容块

    在开始正式制卡之前,我们先介绍一些制卡的基本规则:

    • 内容块中的 标记 元素会被视作挖空的答案
    • 如果将超级块设置为闪卡,则该超级块的第一个子块会被视作问题,其余子块会被视作答案
    • 如果将列表或者列表项设置为闪卡,则非子列表会被视问题,子列表会被视作答案
    • 如果将标题块设置为闪卡,则该标题块会被视作问题,其下方块会被视作答案

    以上规则可以在 设置​ - 闪卡​ 中调整。

    基于文档

    基于文档的使用方式可以不必关注卡包,并且支持父子文档复习。

    • 在块标菜单中选择 快速制卡​ 完成制卡
    • 在文档树面板中右击文档或者在编辑器中点击文档块标 闪卡​ 进入复习

    基于卡包

    基于卡包的使用方式可以将不同文档中的内容块制卡后放到统一的卡包中复习。

    • 在块标菜单中选择 添加到卡包...​​,然后将该内容块添加到一个卡包中完成制卡
    • 通过点击顶栏菜单中的 闪卡​​ 进入复习

    该使用方式默认关闭,如果需要可以在 设置​ - 闪卡​ - 卡包​ 中开启。但建议不要基于卡包使用闪卡,因为卡包是固定的,没有基于文档使用闪卡灵活。

    设置

    设置​ - 闪卡​ 中可以调整闪卡相关的全局配置,其中 新卡上限​ 和 旧卡上限​ 可以使用文档块自定义属性进行覆盖:

    • riff-new-card-limit
    • riff-review-card-limit

    image

    不同文档上单独配置,相互独立不影响,比如父文档上配置为 5,子文档为 10,那么从父文档复习的时候就是 5,不会叠加子文档的配置。

    ​#注意#​

    • 内容块被删除(或者 ID 改变)后对应的闪卡会失效
    • 不建议启用卡包,该方式已经弃用,继续使用可能会遇到无法解决的问题

    技术实现

    • 卡包数据通过 MessagePack 序列化协议存储在 工作空间/data/storage/riff/​ 文件夹下
    • 启动时加载所有卡包数据到内存,数据同步下载后重新加载一次
    ↩︎ ↩︎
  38. 人工智能

    概述

    通过 OpenAI Chat API 实现文本对话。

    使用方式

    1. 注册 OpenAI 账号,并创建 API Key
    2. 设置​ - AI​ 中进行相关配置
    3. 使用 /AI Chat​ 唤起对话框,输入提问或者需求后确认
    4. 也可以通过块标菜单 人工智能​ 进行更多操作

    ​#注意#​

    • 该功能会将相关文本发送至 OpenAI
    • 调用 OpenAI API 会产生一定费用
    ↩︎
  39. 快捷键

    通用

    名称 操作 备注
    主菜单 Alt+</kbd>​ / ⌥</kbd>​
    新建文档 Ctrl+N​ / ⌘N
    最近打开的文档 Ctrl+E​ / ⌘E
    全局搜索 Ctrl+P​ / ⌘P
    搜索 Ctrl+F​ / ⌘F
    替换 Ctrl+R​ / ⌘R
    切换编辑模式 Ctrl+Shift+G​ / ⇧⌘G
    关闭当前页签 Ctrl+W​ / ⌘W
    跳转到下一个编辑页签 Ctrl+Tab​ / ⌃⇥
    跳转到上一个编辑页签 Ctrl+Shift+Tab​ / ⌃⇧⇥
    跳转到第一个页签 Ctrl+1​ / ⌘1
    跳转到第二个页签 Ctrl+2​ / ⌘2
    跳转到第三个页签 Ctrl+3​ / ⌘3
    跳转到第四个页签 Ctrl+4​ / ⌘4
    跳转到第五个页签 Ctrl+5​ / ⌘5
    跳转到第六个页签 Ctrl+6​ / ⌘6
    跳转到第七个页签 Ctrl+7​ / ⌘7
    跳转到第八个页签 Ctrl+8​ / ⌘8
    跳转到第九个/最后一个页签 Ctrl+9​ / ⌘9
    跳转到下一个页签 Ctrl+Shift+[​ / ⇧⌘[
    跳转到上一个页签 Ctrl+Shift+]​ / ⇧⌘]
    向右分屏页签 - 可前往 设置 - 快捷键​ 中配置
    向右分屏并移动页签 - 可前往 设置 - 快捷键​ 中配置
    向下分屏页签 - 可前往 设置 - 快捷键​ 中配置
    向下分屏并移动页签 - 可前往 设置 - 快捷键​ 中配置
    取消分屏 - 可前往 设置 - 快捷键​ 中配置
    取消全部分屏 - 可前往 设置 - 快捷键​ 中配置
    文档树面板 Alt+1​ / ⌃1
    联动大纲面板 Alt+2​ / ⌃2
    书签面板 Alt+3​ / ⌃3
    标签面板 Alt+4​ / ⌃4
    日记 Alt+5​ / ⌃5
    收集箱 Alt+6​ / ⌃6
    联动反向链接面板 Alt+7​ / ⌃7
    联动关系图面板 Alt+8​ / ⌃8
    全局关系图面板 Alt+9​ / ⌃9
    闪卡间隔重复 Alt+0​ / ⌃0
    设置 Alt+P​ / ⌥P
    页面重置 Ctrl+0​ / ⌘0
    页面放大 Ctrl+=​ / ⌘=
    页面缩小 Ctrl+-​ / ⌘-
    隐藏/显示窗口 Alt+M​ / ⌥M
    锁屏 Alt+N​ / ⌥N
    上下选择 ​ / 出现提示列表时可进行上下选择
    补全所选内容 回车 使用列表中高亮的内容进行补全
    移动文档 - 可前往 设置 - 快捷键​ 中配置
    定位打开的文档 - 可前往 设置 - 快捷键​ 中配置
    添加到数据库 - 可前往 设置 - 快捷键​ 中配置

    文档树

    名称 操作 备注
    右键菜单 Ctrl+/​ / ⌘/
    选择 ​ / ​ / ​ /
    向上选中或取消块 Shift+↑​ / ⇧↑ Ctrl+点击​ / ⌘点击​ 选中文档,再使用快捷键;长按快捷键可快速扩选
    向下选中或取消块 Shift+↓​ / ⇧↓ Ctrl+点击​ / ⌘点击​ 选中文档,再使用快捷键;长按快捷键可快速扩选
    打开 回车
    删除 Delete
    搜索 Ctrl+F​ / ⌘F
    替换 Ctrl+R​ / ⌘R
    重命名 F2
    菜单 Ctrl+/​ / ⌘/
    间隔重复 Alt+F​ / ⌥F
    移动 - 可前往 设置- 快捷键​ 中配置
    定位打开的文档 - 可前往 设置- 快捷键​ 中配置

    编辑器

    通用

    名称 操作 备注
    全选 Ctrl+A​ / ⌘A 代码块中使用时仅选中代码块中的内容
    固定搜索 Ctrl+Shift+F​ / ⇧⌘F​ / 点击标签
    剪切/剪切块内容 Ctrl+X​ / ⌘X 没有选择内容时为剪切块内容
    复制 Ctrl+C​ / ⌘C 没有选择内容时为复制块内容
    复制块超链接 Ctrl+Shift+H​ / ⇧⌘H
    复制该块为嵌入块 Ctrl+Shift+E​ / ⇧⌘E
    复制该块为块引用 Ctrl+Shift+C​ / ⇧⌘C
    跳转到父块的下一个块 Ctrl+Shift+N​ / ⇧⌘N
    跳转到父块的上一个块 Ctrl+Shift+M​ / ⇧⌘M
    跳转到父块 Ctrl+Shift+J​ / ⇧⌘J
    重复当前或选中的块 Ctrl+D​ / ⌘D
    粘贴 Ctrl+V​ / ⌘V 可将选中内容作为链接标题或块引用锚点
    块属性 Ctrl+Alt+A​ / ⌥⌘A 选择内容时为设置块命名
    快速制卡 Ctrl+Alt+F​ / ⌥⌘F
    撤销 Ctrl+Z​ / ⌘Z
    重做 Ctrl+Y​ / ⌘Y
    重命名 F2
    使用选中内容作为新建文档的名称并引用 F3
    使用选中内容作为新建文档的名称并引用 Ctrl+F3​ / ⌘F3 遵循 块引新建文档存放位置
    使用选中内容/块作为新建文档的内容 F4
    刷新编辑器 F5
    打开链接中的文件位置 Alt+A​ / ⌥A
    大纲 Alt+O​ / ⌥O
    反向链接 Alt+B​ / ⌥B
    关系图 Alt+G​ / ⌥G
    间隔重复 Alt+F​ / ⌥F
    历史 Alt+H​ / ⌥H
    全屏 Alt+Y​ / ⌥Y
    居左 Alt+L​ / ⌥L
    居中 Alt+C​ / ⌥C
    居右 Alt+R​ / ⌥R
    切换为编辑模式 Ctrl+Alt+7​ / ⌥⌘7
    切换为预览模式 Ctrl+Alt+9​ / ⌥⌘9
    块前插入空块 Ctrl+Shift+B​ / ⇧⌘B
    块后插入空块 Ctrl+Shift+A​ / ⇧⌘A
    块向上移动 Ctrl+Shift+↑​ / ⇧⌘↑
    块向下移动 Ctrl+Shift+↓​ / ⇧⌘↓
    选中行首至光标内容 Shift+Home​ / ⇧⌘←
    选中光标至行末内容 Shift+End​ / ⇧⌘→
    选中块首至光标内容 ⇧⌃A 仅 macOS
    选中光标至块末内容 ⇧⌃E 仅 macOS
    选中页首至光标内容 Ctrl+Shift+Home​ / ⇧Home
    选中光标至页末内容 Ctrl+Shift+End​ / ⇧End
    光标移动到行首 Home​ / ⌘←

    光标移动到行末 End​ / ⌘→
    光标移动到块首 ⌃A 仅 macOS
    光标移动到块末 ⌃E 仅 macOS
    滚动到顶部 Ctrl+Home​ / ⌘Home
    滚动到底部 Ctrl+End​ / ⌘End
    向上滚动一屏 PageUp
    向下滚动一屏 PageDown
    向左逐一选择 Shift+←​ / ⇧←
    向右逐一选择 Shift+→​ / ⇧→
    向上选中或取消块 Shift+↑​ / ⇧↑
    向下选中或取消块 Shift+↓​ / ⇧↓
    依次向上选中块 Shift+Alt+↑​ / ⌥⇧↑
    依次向下选中块 ShiftAlt+↓​ / ⌥⇧↓
    折叠/展开当前块 Ctrl+↑​ / ⌘↑
    展开当前块 Ctrl+↓​ / ⌘↓
    聚焦进入 Alt+→​ / ⌥→
    聚焦返回 Alt+←​ / ⌥←
    选择多个块 Shift+点击​ / ⇧点击
    删除 Backspace
    引用块 ((​ / [[​ / ((​ / 【【​ / Alt+[​ / ⌥[ Alt+[​ / ⌥[​ 需选中文本内容
    嵌入块 {{​ / 「「
    唤起功能菜单 /​ /
    唤起菜单 Ctrl+/​ / ⌘/ 光标在行级元素中唤起对应的功能菜单,否则唤起块菜单
    打开 Atl+,​ / ⌥, 光标需停留在引用/超链接/资源文件/PDF 标注引用元素内
    在后台页签中打开 Ctrl+Shift+.​ / ⇧⌘. 光标需停留在引用元素内
    在页签右侧打开 Alt+.​ / ⌥. 光标需停留在引用元素内
    在页签下侧打开 Ctrl+Alt+.​ / ⌥⌘.
    光标需停留在引用元素内
    在浮窗中打开
    - 可前往 设置- 快捷键​ 中配置,光标需停留在引用元素内
    水平布局 - 可前往 设置- 快捷键​ 中配置
    垂直布局 - 可前往 设置- 快捷键​ 中配置
    复制纯文本 - 可前往 设置- 快捷键​ 中配置
    复制 文本 * - 可前往 设置- 快捷键​ 中配置
    复制 ID - 可前往 设置- 快捷键​ 中配置
    复制块超链接(Markdown) - 可前往 设置- 快捷键​ 中配置
    复制为副本 - 对于数据库块是 复制为镜像副本​,可前往 设置- 快捷键​ 中配置
    复制为完整副本 - 仅对数据库块可用,可前往 设置- 快捷键​ 中配置
    网络图片转换为本地图片 - 可前往 设置- 快捷键​ 中配置
    网络资源文件转换本地 - 可前往 设置- 快捷键​ 中配置
    优化排版 - 可前往 设置- 快捷键​ 中配置
    退出聚焦 - 可前往 设置- 快捷键​ 中配置
    切换只读模式 - 可前往 设置- 快捷键​ 中配置
    唤起人工智能 - 可前往 设置- 快捷键​ 中配置

    插入元素

    名称 操作 备注
    表情 : 需在 :​ 后输入文本
    引用块 Alt+[​ / ⌥[ 需选中内容
    粗体 Ctrl+B​ / ⌘B
    斜体 Ctrl+I​ / ⌘I
    标记 Alt+E​ / ⌥E
    标签 Ctrl+T​ / ⌘T
    删除线 Ctrl+Shift+S​ / ⇧⌘S
    上标 Ctrl+H​ / ⌘H
    下标 Ctrl+J​ / ⌘J
    键盘 Ctrl+'​ / ⌘'
    下划线 Ctrl+U​ / ⌘U
    行级数学公式 Ctrl+M​ / ⌘M
    字体设置 Ctrl+Alt+X​ / ⌥⌘X
    最近使用过的字体
    Alt+X​ / ⌥X 将选中内容设置为最近一次使用过的字体样式
    分隔线 ---
    代码 Ctrl+G​ / ⌘G
    引述块 >
    链接 Ctrl+K​ / ⌘K
    代码块 ```回车 ​ / Ctrl+Shift+K​ / ⇧⌘K
    无序列表 * 相关快捷键参见下文
    有序列表 1. 相关快捷键参见下文
    任务列表 Ctrl+L​ / ⌘L​ / []​ / 【】 相关快捷键参见下文
    表格 Ctrl+O​ / ⌘O 相关快捷键参见下文

    标题

    名称 操作
    转换为段落 Ctrl+Alt+0​ / ⌥⌘0
    一级标题 Ctrl+Alt+1​ / ⌥⌘1
    二级标题 Ctrl+Alt+2​ / ⌥⌘2
    三级标题 Ctrl+Alt+3​ / ⌥⌘3
    四级标题 Ctrl+Alt+4​ / ⌥⌘4
    五级标题 Ctrl+Alt+5​ / ⌥⌘5
    六级标题 Ctrl+Alt+6​ / ⌥⌘6

    列表

    名称 操作 备注
    带子列表缩进 Tab
    反向缩进 1 Shift+Tab​ / ⇧⇥
    反向缩进 2 Delete 行首
    完成和待办之间切换 Ctrl+回车​ / ⌘回车​ / 点击 任务列表
    插入末尾子项 Alt+回车​ / ⌥回车

    表格 Ctrl+Shift+M / ⇧⌘M

    名称 操作
    在上方插入一行 Ctrl+Shift+T​ / ⇧⌘T
    在下方插入一行 Ctrl+Shift+D​ / ⇧⌘D
    在左边插入一列 Ctrl+Shift+L​ / ⇧⌘L
    在右边插入一列 Ctrl+Shift+R​ / ⇧⌘R
    当前行上移 Ctrl+Alt+T​ / ⌥⌘T
    当前行下移 Ctrl+Alt+B​ / ⌥⌘B
    当前列左移 Ctrl+Alt+L​ / ⌥⌘L
    当前列右移 Ctrl+Alt+R​ / ⌥⌘R
    删除行 Ctrl+-​ / ⌘-
    删除列 Ctrl+Shift+-​ / ⇧⌘-
    将光标移动到上一个元素 Shift+Tab​ / ⇧⇥
    将光标移动到下一个元素 Tab​ /

    搜索

    ​#注意#​:在搜索界面使用快捷键。

    名称 操作
    导航 ​ / ​ / PageUp​ / PageDown
    新建 Ctrl+N​ / ⌘N
    打开 / 打开文件位置 回车​ / 双击
    切换到下一个命中 点击
    右侧分屏打开 Alt+.​ / Alt+点击​ / ⌥.​ / ⌥点击
    退出搜素 Esc

    PDF

    ​#注意#​:使用快捷键时,焦点需在 PDF 上,否则请点击 PDF。

    名称 操作
    矩形框标注 Ctrl+D​ / ⌘D
    矩形标注 Alt+D​ / ⌥D
    划选标注 0​ 最近一次使用的颜色 / 1-7​ 对应颜色
    搜索 Ctrl+F​ / ⌘F
    搜索下一项 Ctrl+G​ / ⌘G
    放大 Ctrl+=​ / ⌘=
    缩小 Ctrl+-​ / ⌘-
    向上滚动
    向下滚动
    全屏预览 Ctrl+Alt+P​ / ⌥⌘P
    聚焦到页码输入框 Ctrl+Alt+G​ / ⌥⌘G
    上一页 P​ / K
    下一页 J​ / N
    第一页 Home
    最后一页 End
    文本选则工具 S
    手形工具 H
    顺时针旋转 R
    逆时针旋转 Shift+R​ / ⇧R
    侧栏切换 F4

    点击/拖拽时使用辅助键

    块标

    名称 操作
    打开菜单 点击
    聚焦进入 Ctrl+点击​ / ⌘点击
    折叠/展开 Alt+点击​ / ⌥点击
    属性 Shift+点击​ / ⇧点击
    移动 拖拽
    重复 Ctrl+拖拽​ / ⌃拖拽
    生成块引用 Alt+拖拽​ / ⌥拖拽
    生成嵌入块 Shift+拖拽​ / ⇧拖拽

    列表

    名称 操作 备注
    移动
    拖拽 列表项图标
    打开菜单 点击 列表项图标
    聚焦进入 Ctrl+点击​ / ⌘点击 列表项图标
    折叠/展开所有同级 Alt+点击​ / ⌥点击 列表项图标
    属性 Shift+点击​ / ⇧点击 列表项图标
    折叠/展开当前层级 点击 折叠图标
    折叠/展开所有子级 Alt+点击​ / ⌥点击 折叠图标

    块引用 / 关系图节点

    名称 操作 备注
    打开页签 点击
    静默打开 Ctrl+点击​ / ⌘点击
    在右侧打开 Alt+点击​ / ⌥点击
    在下侧打开 Shift+点击​ / ⇧点击
    查看定义块的所有引用 Shift+悬浮​ / ⇧悬浮 仅在引用元素上支持

    文档树

    名称 操作 备注
    打开页签 点击
    多选 Ctrl+点击​ / ⌘点击
    在右侧打开 Alt+点击​ / ⌥点击
    在下侧打开 Shift+点击​ / ⇧点击
    在新页签中打开 Ctrl+Alt+点击​ / ⌥⌘点击​ / 鼠标中键 需设置为在当前页签中打开
    移动 拖拽
    生成块引用 Alt+拖拽​ / ⌥拖拽

    搜索列表

    名称 操作
    打开页签 点击
    在右侧打开 Alt+点击​ / ⌥点击
    展现关键字/替换历史列表 Alt+↓​ / ⌥↓

    本地资源文件 / PDF 标注

    名称 操作
    打开页签 点击
    使用文件夹打开 Ctrl+点击 / ⌘点击
    使用本地程序打开 Shift+点击 / ⇧点击

    块嵌入

    名称 操作
    弹出悬浮窗 点击
    静默打开 Ctrl+点击 / ⌘点击
    在右侧打开 Alt+点击 / ⌥点击
    在下侧打开 Shift+点击 / ⇧点击

    上传资源文件

    名称 操作
    复制粘贴 Ctrl+C/V​ / ⌘C/V
    复制为资源文件并插入
    拖拽
    使用 file:// 绝对路径并链接
    拖拽+Alt​ / ⌥拖拽​ / 粘贴为纯文本

    ↩︎

  40. 在浏览器上使用

    浏览器用法

    设置​ - 关于​ - 在浏览器上使用​ - 打开浏览器​ 后就可以直接在浏览器上使用了,如果需要在局域网内使用,将 127.0.0.1​ 换成局域网 IP 地址即可。

    除了本地局域网使用,通过以下两个方法可以实现公网使用:

    • 通过“内网穿透”技术将本地内核服务发布在公网上(较为麻烦且不稳定,不推荐)
    • 自行搭建思源服务端(推荐)

    在着手前,请从了解思源笔记技术架构开始。

    访问鉴权

    设置 - 关于 中可配置浏览器访问鉴权密码,留空表示不启用鉴权。这在开放网络(比如办公场所和公网)会比较有用,只有鉴权通过后才能进入工作空间。 ↩︎ ↩︎ ↩︎

  41. Docker 伺服

    概述

    在服务器上伺服思源最简单的方案是通过 Docker 部署。

    文件结构

    整体程序位于 /opt/siyuan/ 下,基本上就是 Electron 安装包 resources 文件夹下的结构:

    • appearance:图标、主题、多语言
    • guide:帮助文档
    • stage:界面和静态资源
    • kernel:内核程序

    启动入口

    构建 Docker 镜像时设置了入口:ENTRYPOINT [ "/opt/siyuan/kernel" ],使用 docker run b3log/siyuan 并带参即可启动:

    • --workspace 指定工作空间文件夹路径,在宿主机上通过 -v 挂载到容器中

    更多的参数可参考这里[42:1]。下面是一条启动命令示例:docker run -d -v workspace_dir_host:workspace_dir_container -p 6806:6806 b3log/siyuan --workspace=workspace_dir_container

    • workspace_dir_host:宿主机上的工作空间文件夹路径
    • workspace_dir_container:容器内工作空间文件夹路径,和后面 --workspace 指定成一样的

    为了简化,建议将 workspace 文件夹路径在宿主机和容器上配置为一致的,比如将 workspace_dir_host​ 和 workspace_dir_container​ 都配置为 /siyuan/workspace​,对应的启动命令示例:docker run -d -v /siyuan/workspace:/siyuan/workspace -p 6806:6806 -u 1000:1000 b3log/siyuan --workspace=/siyuan/workspace/​。

    用户权限

    镜像中是使用默认创建的普通用户 siyuan(uid 1000/gid 1000)来启动内核进程的,所以在宿主机创建工作空间文件夹时请注意设置该文件夹所属用户组:chown -R 1000:1000 /siyuan/workspace,在启动容器时需要带参数 -u 1000:1000

    隐藏端口

    使用 NGINX 反向代理可以隐藏 6806 端口,请注意:

    • 配置 WebSocket 反代 /ws

    #注意#​

    • 请务必确认挂载卷的正确性,否则容器删除后数据会丢失
    • 不要使用 URL 重写进行重定向,否则鉴权可能会有问题,建议配置反向代理

    限制

    • 不支持桌面端和移动端应用连接,仅支持在浏览器上使用
    • 不支持导出 PDF、HTML 和 Word 格式
    • 不支持导入 Markdown 文件
    ↩︎
  42. 内核参数

    --workspace

    用于指定工作空间文件夹路径,不指定时的默认值是 ~/SiYuan/

    --wd

    内核工作目录路径,不指定时按内核可执行文件入口自动获取。

    --readonly

    使用 --readonly=true 指定后内核将以只读模式运行,所有写入操作将被禁止。

    --accessAuthCode

    用于指定浏览器访问鉴权密码[^74],设置后会覆盖 conf.json 中的 authCode。

    --ssl

    使用 --ssl=true 后将使用 https 和 wss 协议进行伺服。

    --lang

    使用 --lang=zh_CN 后将使用简体中文初始化外观语言,默认 en_US。目前可选值:zh_CNzh_CHTen_USfr_FR

    --mode

    使用 --mode=dev 后将使用开发模式运行,使用 --mode=prod 将使用生产模式运行,默认 prod

    开发模式和生产模式的主要区别开发模式会使用 工作目录/appearance/ 作为外观文件夹,而生产模式使用的是 工作空间/conf/appearance/

    --port​​

    用于指定监听端口,不指定时:

    • 桌面端使用随机端口
    • Docker/移动端使用 6806
    ↩︎ ↩︎
  43. 内核 API

    请浏览 API 文档 (github repo: siyuan-note/siyuan)。 ↩︎

  44. 分享文档

    概述

    将单篇文档以 Markdown 格式分享到链滴作为帖子发布。

    使用方式

    • 需要注册并登录链滴账号

    • 点击编辑器 ...​ 菜单 分享到链滴

      • 文档标题作为帖子标题
      • 文档标签作为帖子标签
      • 文档导出的 Markdown 作为帖子内容,其中引用转换为脚注
    • 分享完毕后对文档写入属性 custom-liandi-articleId​ 用于关联链滴帖子 ID

    文档中的资源文件会被自动上传到云端图床:

    • 免费用户单个文件小于 3MB
    • 订阅用户单个文件小于 10MB

    ​#注意#​

    • 分享文档到链滴需要积分,请参考积分规则
    • 分享上传到云端图床的资源文件无法删除
    ↩︎
  45. 发布服务

    概述

    思源笔记支持以只读模式在局域网中发布当前工作空间的内容。

    使用方式

    • 打开 设置​ - 发布​ 进入发布服务的设置面板

    • 设置 服务端口号

      • 默认的端口号为 6808
      • 若端口号设置为 0​ 将使用随机端口
    • 若需要对发布服务进行访问控制

      • 添加 认证账户​ 并开启 服务 Basic 认证​ 开关

      • 开启后发布服务将使用 Basic 验证方案 对访问者进行认证

        • 访问者在浏览发布内容前必须正确输入 认证账户​ 中设置的用户名与密码
    • 开启 发布服务​ 开关

    #注意#​

    • 开启发布服务后访问者可以浏览整个工作空间的内容
    • 关闭 服务 Basic 认证​ 后所有的访问者无需认证即可浏览整个工作空间的内容
    ↩︎
  46. 云端服务

    会员云端服务包括:

    ​#注意#​​:云端服务相关限制[53:1]

    会员云端服务需要付费订阅后才能使用:

    ↩︎
  47. 存储空间

    概述

    云端存储空间大小为 8G,分为以下部分:

    • 同步数据:提供给同步功能使用,数据是加密的
    • 备份数据:提供给备份功能使用,数据是加密的
    • 资源文件:提供给复制到公众号、知乎和语雀等使用,HTTPS CDN

    使用量可以在 设置​ - 云端​ 中查看。

    端到端加密

    同步数据和备份数据使用端到端加密传输,云端不保存任何明文数据。

    • 密钥仅存储在本地,不会上传到云端
    • 加密和解密过程完全在本地设备上进行
    • 加密算法为业界公认安全的 AES GCM

    常见问题

    开发者是否能够解密我的云端数据?

    无法解密。如果遗失密钥,任何人(包括开发者)都无法帮你从云端恢复数据。

    是否能够付费扩容云端存储空间大小?

    可以通过链滴积分兑换扩容,具体规则请看这里↩︎ ↩︎

  48. 数据同步

    概述

    数据同步指的是在多个设备上保持 工作空间/data/ 文件夹数据一致,包括资源文件、模板、挂件以及笔记本数据。

    使用方式

    初始化数据仓库密钥[^26]后如果一切正常就已经配置好同步了。如果你不太熟悉同步配置,建议通过点击同步按钮打开同步配置向导,通过向导进行配置会更简便一些。

    • 如果需要暂停同步,可关闭选项 设置 - 云端 - 启用云端同步
    • 忽略文件[^27]

    ​#注意#​​:

    • 启用同步前,请确保参与同步的所有设备系统时间一致
    • 如果数据量较大,建议通过设置中的 导出 - Data​ 导出数据包,然后将该数据包通过手动拷贝或者其他方式发送到新设备上,并在新设备上 导入 - Data​,最后再配置同步

    同步模式

    设置​ - 云端​ - 云端同步模式​ 中支持三种同步模式:

    • 自动同步

      • 启动和退出时会进行一次同步,使用中数据不再变动后 30 秒进行一次同步
      • 由同步算法决定数据合并和覆盖,请参考下述工作原理介绍
    • 手动同步

      • 仅启动和退出时进行一次同步,使用中需要手动触发同步
      • 由同步算法决定数据合并和覆盖,请参考下述工作原理介绍
    • 完全手动同步:启动和退出时均不同步,完全手动控制同步时机和同步方向

    自动/手动同步模式工作原理

    思源通过对比云端数据快照和本地数据快照进行相应操作:

    • 如果快照相同则忽略本次同步

    • 如果快照不同,则将本地距离上次同步的变更上传到云端,将云端最新的变更合并到本地

      • 如果两端的变更没有冲突则直接合并
      • 如果存在文件冲突,则以本地为准覆盖云端,同时拉取到的云端冲突文件会归入到数据历史中

    自动同步时间间隔算法描述如下:

    • 数据变动后 30 秒如果不再发生变动则进行一次对比,如果继续发生变动则顺延 30 秒
    • 没有数据变动则按 5 分钟、8 分钟、16 分钟、32 分钟……递增间隔

    自动同步模式场景例举

    从上述工作原理我们可以得知,思源仅支持在多设备上交替同步数据:设备 A 上同步完成以后设备 B 上再进行同步。无法支持多设备同时同步,这样会发生无法预期的数据覆盖。

    正常场景

    1. 在设备 A 上编辑后执行同步(通过自动或者手动触发同步),此时云端数据会被设备 A 数据覆盖,既云端和设备 A 保持数据一致
    2. 在设备 B 上执行同步,此时设备 B 数据会被云端数据覆盖,即云端和设备 A、B 保持数据一致
    3. 设备 B 上编辑后再次执行同步,此时云端数据会被设备 B 数据覆盖,既云端和设备 B 保持数据一致
    4. 在设备 A 上执行同步,此时设备 A 数据会被云端数据覆盖,即云端和设备 A、B 保持数据一致

    该场景下,使用同步的过程是在设备 A、B 上交替进行的,这样能够保证数据同步符合预期正常完成。

    冲突场景

    1. 在设备 A 上编辑 a 文件后同步
    2. 在设备 B 上编辑 a 文件后同步
    3. 此时云端 a 文件会被 B 设备上的 a 覆盖,同时在 B 设备上生成之前 A 设备 a 的历史

    #注意#

    • 睡眠或关机等突然断网的情况下不会触发同步,请手动点击同步按钮进行同步

    • 请勿同时使用第三方同步盘和思源同步,可能会导致数据损坏

    • 符号链接和隐藏文件不会被同步

    • 自动同步模式下,如需退出,请使用正常的退出应用(比如移动端 APP 不要使用滑动移除,桌面端不要使用结束进程强制关闭)方式以保证数据同步执行

    • 数据同步前进行数据快照如果耗时超过 12 秒会提示清理数据仓库,如果需要改动默认耗时,可通过如下两种方式

      • 环境变量 SIYUAN_SYNC_INDEX_TIMING​,例如 SIYUAN_SYNC_INDEX_TIMING=30000​,单位是毫秒
      • 直接修改 工作空间/conf/conf.json 中的 repo.syncIndexTiming

      最小值只能配置为 12000​(12 秒),最大值不限制;启动时会优先读取环境变量覆盖 conf 文件中的值。

    ↩︎ ↩︎ ↩︎
  49. 数据备份

    概述

    数据备份指的是将数据快照[^29]上传到云端。

    使用方式

    1. 初始化数据仓库密钥[^26]后如果一切正常就已经配置好备份了
    2. 打开 数据历史 - 数据快照 页签,选择需要备份的快照点击 标记快照
    3. 筛选下拉列表中选择 本地标记的快照,选择需要上传的快照点击 上传
    4. 上传完成以后,筛选下拉列表中选择 云端标记的快照 可以看到刚刚备份到云端的快照
    5. 云端备份的快照下载到本地后可以通过回滚数据快照[^30]恢复数据

    另外:

    • 忽略文件[^27]
    • 云端最多支持保存 12 个数据快照

    ↩︎ ↩︎

  50. 资源文件图床

    思源提供了云端图床服务,主要用于将文档带资源文件复制到微信公众号、知乎和语雀等平台,这些平台的编辑器在粘贴时会自动拉取资源文件到它们的平台上。

    使用方式

    1. 文档右上角 ... 更多菜单中选择 上传资源文件到云端图床
    2. 模式切换 中选择 导出预览
    3. 点击 复制到公众号复制到知乎复制到语雀
    4. 到目标平台编辑器上粘贴

    如果需要删除云端图床中的资源文件,请到 链滴 - 设置 - 文件 - 笔记端 操作。删除后该文件占用的云端存储空间会立即释放,但是 CDN 缓存清理可能无法及时生效,这会导致该文件 URL 依然可以访问,直到 CDN 缓存 30 天以后自动过期。

    #注意#

    • 请勿直接在其他平台使用云端图床提供的外链地址,这个地址不稳定,可能会因为换域名而影响可用性
    • 请勿上传违法违规或敏感资源文件,上传的资源文件会通过第三方提供的服务进行审核(色情、暴恐、敏感人物等)。如果发现使用者上传违规资源文件,使用者账号会被永久封禁,并承担相应的法律责任
    ↩︎ ↩︎
  51. 收集箱

    概述

    我们可以通过云端收集箱对外部数据进行收集,然后在思源中通过收集箱面板从云端获取这些数据并发送到笔记本中进行进一步整理。

    使用方式

    目前提供以下两种方式进行数据接入。

    微信输入

    1. 链滴 - 设置 - 账号 中绑定微信

    2. 关注 B3log开源 公众号

      image.png

    3. 关注后点击右下角绑定账号

    4. 对该公众号发送消息(可从收藏中选择待发送消息),仅支持文本、图片和超链接

    5. 在思源中打开收集箱面板(Alt+6)

    关注公众号并绑定账号后除了可以通过公众号输入,也可以通过添加 思源小助手 为联系人后输入,这样可以直接转发聊天记录。

    image

    支持的消息类型为文本、图片、语音、视频和文件,单个图片、语音、视频和文件的大小不超过 20MB。

    ​#注意#​:

    • 仅限订阅会员使用,未订阅或者订阅过期后联系人关系会被删除

    API

    • POST https://ld246.com/apis/siyuan/inbox/addCloudShorthand

    • Body

      {
          "title": "A simple text title",
          "content": "Content with **Markdown**."
      }
      
    • 鉴权方式为 HTTP 请求标头 Authorization,值为 token {Your API Token}(注意大小写和空格),API Token 可以 链滴 - 设置 - 账号 中找到

    ​#注意#​:

    • 频率限制:每 24 小时最多插入 128 条

    ↩︎ ↩︎ ↩︎

  52. 微信提醒

    概述

    微信提醒功能用于将内容块发送到云端,到期时通过微信公众号模板消息推送到用户微信。

    使用方式

    1. 链滴 - 设置 - 账号 中绑定微信

    2. 关注 B3log开源 公众号

      image.png

    3. 关注后点击右下角绑定账号

    4. 在思源中通过块标菜单设置提醒

    #注意#

    • 提醒时间误差大概在 10 秒左右
    • 内容块会以明文的形式发送到云端,且仅发送文本,不发送资源文件
    • 请勿设置提醒违法违规或敏感内容,否则账号会被永久封禁,并承担相应的法律责任
    ↩︎ ↩︎
  53. 限制

    • 最多支持创建 7 个云端同步目录

    • 最多支持保存 12 个数据快照

    • 云端存储空间初始化总大小为 8G

    • 云端存储中的数据快照最长保留 30 天,即 30 天之前的未引用快照会被自动清理

      • 每次数据同步后的最新快照不会被清理
      • 手动标记备份上传到云端的快照不会被清理
      • 30 天内的快照不会被清理
    • 付费订阅到期以后,云端存储会被彻底删除

      • 从到期前 15 天,每次打开软件都会弹出到期提醒,到期 2 天后停止提醒
      • 到期前 1 天,会推送一次短信提醒到账号绑定的手机上
      • 删除云端存储不影响本地数据
    ↩︎ ↩︎
  54. 功能特性

    会员功能特性包括:

    • 对接第三方云端存储[55:2]
    • 搜索资源文件内容[56:1]

    会员功能特需要付费后才能使用:

    ↩︎
  55. 对接第三方云端存储

    请在 设置​ - 云端​ - 云端存储服务提供商​ 中进行选择和配置,目前已经支持:

    通过第三方云端存储服务同步数据同样是端到端加密[^21]的,第三方云端存储服务提供商无法获得我们的明文数据。

    ​#注意#​:为了保障数据同步的可用性,请确保:

    • 多设备系统时间一致,误差请控制在一分钟以内
    • 网络稳定(比如中国大陆地区请勿使用非中大陆地区的服务)
    • 不要启用 CDN
    ↩︎ ↩︎ ↩︎
  56. 搜索资源文件内容

    搜索​ 界面右上角可以将搜索功能切换到 搜索资源文件内容​,目前支持如下格式的资源文件内容搜索:

    • 文本文件(.txt、.md、.json、.log、.sql、.html、.xml、.java、.h、.c、.cpp、.go、.rs、.swift、.kt、.py、.php、.js、.css、.ts、.sh、.bat、.cmd、.ini、.yaml、.rst、.adoc、.textile、.opml、.org、.wiki)
    • .docx
    • .pptx
    • .xlsx
    • .pdf

    ​#注意#​​:

    • 不支持大于 4MB 的文本文件
    • 不支持大于 1024 页的 PDF
    • 默认不支持大于 128MB 的 PDF,可通过环境变量 SIYUAN_PDF_ASSET_CONTENT_INDEX_MAX_SIZE​ 设置,值的单位是字节,比如:SIYUAN_PDF_ASSET_CONTENT_INDEX_MAX_SIZE=256000000​ 将上限调整为 256MB
    • Android/iOS 端不支持 PDF 资源文件内容搜索
    ↩︎ ↩︎
  57. 移动端 App

    概述

    思源笔记提供了 Android 端和 iOS 端 App,已经上架部分手机应用商店,请在应用商店中搜索 思源笔记​ 或者 SiYuan​。

    安装和更新

    目前已经上架应用商店:

    • 小米
    • 华为
    • OPPO
    • vivo
    • 苹果
    • 酷安
    • Google Play

    APK 下载: https://b3log.org/siyuan/download.html

    使用集市

    因为应用商店审核原因,目前无法直接在 App 上提供集市。

    如需使用集市,请启用 关于​ - 网络伺服​,然后在桌面端浏览器上访问配置。

    #注意#​

    • 卸载 App 会导致本地数据被完全删除且无法恢复
    • 退出应用请使用右侧面板中的 退出应用​ 进行正常退出,直接划走会强制结束应用,导致数据同步未被执行
    • iOS 端切换应用后会导致连接中断,请点击提示框中的按钮手动重连
    • 数据同步过程中请勿切换应用并保持亮屏,否则会导致数据同步失败
    ↩︎
  58. 数据安全

    概述

    数据安全主要分为两方面:

    • 可用性[^80]:数据不丢失,保持数据的完整和一致
    • 机密性:数据不被泄漏、不被篡改

    思源对这两方面都进行了一定支持,下面是关于数据安全方面的说明。

    明文存储

    思源使用明文方式将数据存储在本地文件系统上,这意味着:

    • 任何能够使用操作系统的人或软件都读取其中的数据
    • 数据的可用性依赖于硬件磁盘和操作系统的可用性

    端到端加密

    思源云端同步使用端到端加密[^21],密码在本地通过内置密钥加密保存,除使用者之外的任何第三方均无法在云端获得明文数据。

    建议

    • 定期备份数据,参考 321 备份原则(至少 3 个副本、2 种介质和 1 个异地存储)
    • 重要密码、密钥或者核心机密等建议使用专用软件、设备或者离线保存

    威胁模型

    主要针对本地数据安全和思源云端存储安全进行评估。

    前提假设

    • 本地操作系统是完全受信任的环境。这是数据安全最基础的前提,基于该前提才能保证

      • 原始数据的可用性
      • 原始数据不被泄漏
      • 密钥的安全性
    • 用户不泄漏密钥给攻击者

    • 云端存储中的数据不被删除

    • AES-GCM 加密算法未被攻破

    • 攻击者无法提供暴力破解所需算力

    云端存储能够保证

    • 只有通过正确的密钥才能解密数据
    • 数据被篡改后无法解密

    正常示例

    基于上述假设和保证,下面是攻击者能够达成的目标示例。

    如果攻击者对云端存储具有只读权限,那么他能够:

    • 获取到已经加密的数据,尝试暴力破解
    • 通过索引信息推断出数据大小

    如果攻击者能够劫持网络,那么他能够:

    • 篡改数据造成数据不可用
    • 获得用户 ID 信息
    • 通过流量推断出数据大小

    异常示例

    如果违反了上述假设或保证,下面是攻击者能够达成的目标和示例。

    如果攻击者能够入侵本地操作系统,那么他能够:

    • 修改或删除原始数据,造成原始数据不可用
    • 获得原始数据
    • 获得密钥

    如果攻击者对云端存储具有写入权限,那么他能够:

    • 修改或删除云端存储,造成云端存储数据不可用
    ↩︎
  59. 术语表

    概述

    在思源中,涉及到了一些相对复杂的术语,这些术语可能会让人感到困惑。在本章节中,我们会逐一对这些术语进行解释,希望能够帮助你更好地理解和使用思源。

    请#注意#​,以下内容在涉及到具体功能时主要以桌面端为主进行介绍。

    编辑器

    面包屑

    通常情况下,面包屑是应用程序导航中的一种辅助元素,通常位于顶部或页面顶部下方的水平序列中。它显示了用户当前所在位置的路径,在用户导航过程中提供了便利的记忆和方向感。面包屑可以让用户更容易地浏览网站结构、快速返回到前一个页面或更高级别的页面,并减少无效点击和迷路的可能性。它可以作为用户体验设计的一部分,提高应用的可用性和易用性。

    在思源中,面包屑指的是编辑器顶部由右箭头相连的块路径,用于在块结构中导航。其中每一层都由块标开头,鼠标悬浮可以打开预览浮窗。

    锚文本

    通常情况下,锚文本是指在超链接中被点击的文本部分,它通常是蓝色的。锚文本可以与超链接的 URL 地址相连接,当用户点击锚文本时,就会自动跳转到相应的网页或文件。锚文本可以是任何文字或短语,但通常应与所链接的内容相关联,一般是目标跳转内容的标题。

    在思源中,我们将通常意义上的锚文本从超链接元素扩展到了块引用、PDF 标注引用元素上。特殊地,对于块引用元素锚文本还分为静态锚文本和动态锚文本,具体细节请参考引用内容块锚文本[^83]章节。

    编辑器模式

    • 所见即所得:常规情况下的编辑器界面

      • 可编辑:支持修改内容
      • 仅只读:仅支持查看内容,不支持修改
    • 导出预览:转换为标准 Markdown 后进行预览

    所见即所得和导出预览模式切换位于编辑器右上角 ​ 菜单中;所见即所得编辑和只读模式切换位于顶栏右上角。

    数据仓库

    密钥

    密钥用于加密数据快照,有三种生成方式[^84]。建议普通用户使用密码短语生成,相同的密码短语可在其他设备上生成相同的密钥,以方便初始化数据同步。

    本地快照

    保存在本地设备上的数据快照。

    本地标记的快照

    本地快照中手动打过标记的快照。打标记的目的是为了方便查找,一个有意义的标记名称可以在回滚快照时起到足够的提示作用。

    云端快照

    保存在云端存储上的数据快照。

    云端标记的快照

    本地标记的快照上传到云端后的数据快照。

    界面

    停靠栏

    主界面左侧、右侧和下侧的边栏,用于存放面板入口按钮。

    面板

    面板指的是从停靠栏上打开的功能区域,比如文档树、大纲和反链等。

    页签

    页签类似浏览器上的标签页,不同类型的页签包含了不同的功能。

    编辑器页签

    用于加载文档编辑器。

    PDF 页签

    用于加载 PDF。

    搜索页签

    将搜索界面在页签中打开,直接这样用户就可以同时使用其他页签,不会被搜索窗口遮挡其他工作。

    间隔重复页签

    将间隔重复界面在页签中打开。

    窗口

    页签可以转换为独立于主界面的窗口,窗口可以拖到主界面之外,避免主界面中过于拥挤。

    通过钉住窗口还可以实现该窗口位于所有应用程序之上,以便用户更好的利用有限的屏幕空间。

    布局

    当前主界面的停靠栏、页签和面板的状态组成了布局,布局可以在左上角工作空间菜单中进行保存和切换。

    块标

    出现在块前面的图标,面板中出现的块标在大部分情况下都支持通过鼠标悬浮打开预览浮窗,比如大纲面板、反链面板中的块标。

    块标除了悬浮预览,还支持 Ctrl+点击​ 在页签中打开,这在反链面板等需要跳转上下文的场景中尤其有用。

    其他

    伺服

    通过思源内核提供的服务能力以便通过浏览器使用[40:2]↩︎

  60. 性能优化

    概述

    不同硬件配置、不同操作系统平台上性能表现是不一样的。另外,随着数据增多,性能下降无法避免。所以我们可能需要改变使用方式并调整一些配置项来提升性能,以获得更流畅的使用体验。

    整体性能

    • 内容块数量:内容块数量对性能影响范围较大,比如展开文档树、搜索、数据写入等。但也不必太过担心,通常情况下内容块数量在百万这个量级下不会产生太大影响,除非每个块的大小较大
    • 系统环境:操作系统当前负载会影响整体性能
    • 网络环境:通过 网络伺服​ 使用时网络质量会影响请求响应时间

    优化建议:

    • 将不常用的文档或者剪藏的文档单独放置到 存档笔记本​ 或 剪藏笔记本​ 中,关闭它后将减少数据库索引数量以提升性能

    • 调小 搜索结果显示数​,我们会对搜索请求响应时间进行性能监控,如果响应时间超过阈值,则会弹出提示用户调小该配置项

      性能监控阈值可以通过环境变量 SIYUAN_PERFORMANCE_TIMING​ 设置,单位毫秒,默认为 15000,即 15 秒

    • 保持足够的系统资源

    • 使用固态硬盘,将工作空间放置在固态硬盘上能够有效提升整体性能

    • 升级硬件,这是提升性能最快的方式

    编辑器性能

    • 叶子块大小:单个叶子块大小会影响编辑器性能,如果一个叶子块包含了大量字符,那么编辑器可能会卡顿
    • 动态加载块数:加载块数会影响编辑器性能,特别是对于公式块、代码块和图表块较多的情况,如果加载较多块,那么编辑器可能会卡顿
    • 代码块行号:代码块行号会影响编辑器性能,如果一个代码块内容较多且开启了行号显示,那么编辑器可能会卡顿
    • 公式、图片和图表:公式、图片和图表会影响编辑器性能,如果文档中包含了大量公式、图片和图表,那么编辑器可能会卡顿

    优化建议:

    • 避免使用过多软换行,虽然不使用软换行会增加块数,但是少使用软换行可以减小段落块大小避免编辑器卡顿
    • 调小 动态加载块数​,特别是对于公式块、代码块或图表块较多的使用场景。这个参数没有具体的最佳数值,请以调整后感受为准
    • 通过 聚焦​ 减少元素从而提升编辑器性能
    ↩︎
  61. 最新进展

    ↩︎

  62. 扩展开发

    • 主题[22:1] 样例项目 github repo: siyuan-note/theme-sample
    • 图标[21:1] 样例项目 github repo: siyuan-note/icon-sample
    • 挂件[29:3] 样例项目 github repo: siyuan-note/widget-sample
    • 插件[30:3] 样例项目 github repo: siyuan-note/plugin-sample
    • 模板片段[32:3] 样例项目 github repo: siyuan-note/template-sample
    • 集市仓库 github repo: siyuan-note/bazaar
    • 社区开发者资源

    ​#注意#​:

    • 插件或者外部扩展如果有直接读取或者写入 data 下文件的需求,请通过调用内核 API 来实现,不要自行调用 fs或者其他 electron、nodejs API,否则可能会导致数据同步时分块丢失,造成云端数据损坏。相关 API 见 /api/file/*​(例如 /api/file/getFile​ 等)

    • 思源在创建日记的时候会自动为文档添加 custom-dailynote-yyyymmdd 属性,以方便将日记文档同普通文档区分。

      详情请见 Github Issue #9807。

      开发者在开发手动创建 Daily Note 的功能时请注意:

      • 如果调用了 /api/filetree/createDailyNote​ 创建日记,那么文档会自动添加这个属性,无需开发者特别处理
      • 如果是开发者代码手动创建文档(例如使用 createDocWithMd​ API 创建日记),请手动为文档添加该属性
    ↩︎
  63. 隐私政策和用户协议

    隐私政策

    • 发布日期:2022 年 2 月 11 日
    • 最新日期:2022 年 10 月 27 日

    SiYuan(思源笔记) 是云南链滴科技有限公司(以下简称“我们”)通过合法拥有并运营的、包括且不限于思源笔记桌面端软件、移动端应用、思源笔记云端服务。思源笔记云端服务以及该服务所包括的各种业务功能统称为“我们的产品和服务”。

    我们深知个人隐私信息对您的重要性,所以我们在此承诺保护使用我们的产品和服务的用户的个人信息及隐私安全

    我们的目的是希望能尽量帮您记录更多信息,让您方便的整理和搜索关于您的信息。我们会在尽量提供便利性的基础上,尽量少的收集关于您的信息,尽可能的保护您的隐私。

    所以我们希望通过本协议,向您说明我们在收集和使用您相关个人信息时对应的处理规则,以及我们为您提供的访问、更正、删除和保护这些个人信息的方式,以便更好的保障您的权益。

    本《隐私政策》将帮助您了解以下内容:

    一、我们将收集哪些信息,以及如何收集和使用您的个人信息;

    二、我们如何使用 cookies 或相关技术;

    三、我们可能分享、转让和披露的个人信息;

    四、我们如何保留、储存和保护您的个人信息安全;

    五、如何管理您的个人信息;

    六、第三方服务;

    七、隐私政策的通知和修订;

    八、如何联系我们。

    一、我们将收集哪些信息及如何收集和使用您的个人信息

    我们收集您的个人信息主要是为了您更容易和更满意地使用思源笔记云端服务。而这些个人信息有助于我们实现这一目标。

    我们将通过以下途径收集和获得您的个人信息

    您提供的个人信息。例如:

    • 您在注册思源笔记云端服务的账号或使用思源笔记云端服务时,向我们提供的个人信息;
    • 您通过思源笔记云端服务向其他方提供的共享个人信息,以及您使用思源笔记云端服务时所储存的个人信息。

    如果您不使用思源笔记本云端服务,我们不会收集和获得您的个人信息

    我们会出于以下目的,收集和使用您以下类型的个人信息

    帮助您完成思源云端服务的注册及登录

    为便于我们为您提供完整的服务,您需要提供基本注册或登录个人信息,包括手机号码、电子邮箱地址,并创建您的账号、用户名和密码。

    同时,依照相关法律法规的要求或者特定功能及服务需要,您在使用特定功能及服务前,可能需要您提供其他个人信息(例如姓名、身份证、面部特征及其他身份证明信息)。如果您不提供上述个人信息,我们将不能向您提供相关的功能及服务。

    如果您不再使用思源笔记云端服务,在符合服务协议约定条件及国家相关法律法规规定的情况下,您可以自行注销您的账号,届时我们将停止为您提供思源笔记云端服务。(当您的账号注销后,与该账号相关的思源笔记云端服务项下的全部服务资料和数据将被删除或匿名化处理,但法律法规另有规定的除外。)

    向您提供服务

    我们所收集和使用的个人信息是为您提供思源笔记云端服务的必要条件,如缺少相关个人信息,我们将无法为您提供思源笔记云端服务的核心内容:

    1. 个人信息的发布:您在使用思源笔记云端服务时、上传和/或发布个人信息以及进行相关行为(例如您附加于任何页面上的文件、项目、列表和企业名称或者对某一对象的描述,您在文字、分享、文件上的评论,您上传的图片、表情以及文件等)时,我们将收集您上传、发布或形成的个人信息,并有权在您授权的情况下,展示您的昵称、头像和发布内容。
    2. 支付结算:如您在使用我们的服务过程中产生支付结算,您可以选择思源关联方或与思源合作的第三方支付机构(以下称“支付机构”)所提供的支付服务。您可能会提供付款账号信息,如银行卡卡号等。支付或售后服务过程中我们可能需要将您的订单号与交易金额信息同这些支付机构共享以实现其确认您的支付指令并完成支付。
    3. 订单管理:为展示您的账号的订单信息及保障您的售后权益,思源会收集您在使用思源过程中产生的订单信息、交易和消费记录、虚拟财产信息用于向您展示及便于您对订单进行管理。
    4. 客服与售后服务:当您与我们联系时,我们可能会保存您的通信/通话记录和内容或您留下的联系方式等个人信息,以便与您联系或帮助您解决问题,或记录相关问题的处理方案及结果。为确认交易状态及为您提供售后与争议解决服务,我们会通过您基于交易所选择的交易对象、支付机构、物流公司等收集与交易进度相关的您的交易、支付、物流信息,或将您的交易信息共享给上述服务提供者。
    5. 我们在您使用服务过程中可能收集的个人信息

    为识别账号异常状态,我们可能会收集关于您使用的服务以及使用方式的个人信息并将这些个人信息进行关联,这些个人信息包括:

    1. 日志信息:当您使用思源笔记云端服务时,我们可能会自动收集您对我们服务的详细使用情况,作为有关网络日志保存。例如您的登录账号、搜索查询内容、IP 地址、浏览器的类型、电信运营商、网络环境、使用的语言、访问日期和时间及您访问的网页浏览记录、Push 打开记录、停留时长、刷新记录、发布记录及分享。
    2. 设备信息:我们可能会根据您在软件安装及使用中授予的具体权限,接收并记录您所使用的设备相关信息(例如 IMEI、MAC、Serial、SIM 卡 IMSI 识别码、设备机型、操作系统及版本、客户端版本、设备分辨率、包名、设备设置、进程及软件列表、唯一设备标识符、软硬件特征信息)、设备所在位置相关信息(例如 IP 地址、GPS 位置以及能够提供相关个人信息的 WLAN 接入点、蓝牙和基站传感器信息)。

    请注意:单独的设备信息、日志信息是无法识别特定自然人身份的个人信息。如果我们将这类非个人信息与其他个人信息结合用于识别特定自然人身份,或者将其与个人信息结合使用,则在结合使用期间,这类非个人信息将被视为个人信息,除取得您授权或法律法规另有规定外,我们会将该类个人信息做匿名化、去标识化处理。

    我们通过间接方式收集到的您的个人信息

    我们可能从管理方、第三方合作伙伴获取您授权共享的相关个人信息。例如,我们可能从第三方获取您授权共享的账户个人信息(头像、昵称、登录时间)并在您同意本《隐私政策》后将您的第三方账户与您的思源笔记云端服务账户绑定,使您可以通过第三方账户直接登录并使用我们的产品和服务。 我们将在符合相关法律法规规定,并依据与关联方或第三方合作伙伴的约定、确信其提供的个人信息来源合法的前提下,收集并使用您的这些个人信息。

    1. 基于上述您向我们提供的个人信息、我们可能收集的个人信息及我们通过间接方式收集到的您的个人信息,我们可能会基于上述一项或几项个人信息的结合,识别账号异常状态。

    2. 向您推送消息或发送通知

      我们可能在必需时(例如当我们由于系统维护而暂停某一单项服务、变更、终止提供某一单项服务时)向您发出与服务有关的通知。

      如您不希望继续接收我们推送的消息,您可要求我们停止推送,例如:根据短信退订指引要求我们停止发送推广短信,或在移动端设备中进行设置,不再接收我们推送的消息;但我们依法律规定或单项服务的服务协议约定发送消息的情形除外。

    为您提供安全保障

    为提高您使用我们及合作伙伴提供服务的安全性,保护您或其他用户或公众的人身财产安全免遭侵害,更好地预防钓鱼网站、欺诈、网络漏洞、计算机病毒、网络攻击、网络侵入等安全风险,更准确地识别违反法律法规或 思源 服务相关协议规则的情况,我们可能会收集、使用或整合您的账户信息、交易信息、设备信息、日志信息以及我们关联公司、合作伙伴取得您授权或依据法律共享的个人信息,来综合判断您账户及交易风险、进行身份验证、检测及防范安全事件,并依法采取必要的记录、审计、分析、处置措施。

    改进我们的服务

    我们可能将通过某一项思源笔记云端服务所收集的个人信息,用于我们的其他服务。例如,在您使用某一项思源笔记云端服务时所收集的您的个人信息,可能在另一项思源笔记云端服务中用于向您提供特定内容或向您展示与您相关的、而非普遍推送的信息;我们可能让您参与有关思源笔记云端服务的调查,帮助我们改善现有服务或设计新服务;同时,我们可能将您的个人信息用于软件更新。

    您了解并同意,在收集您的个人信息后,我们将通过技术手段对数据进行去标识化处理,去标识化处理的个人信息将无法识别您的身份,在此情况下我们有权使用已经去标识化的个人信息,对用户数据库进行分析并予以商业化的利用。

    其他用途

    请您注意,如果我们要将您的个人信息用于本《隐私政策》中未载明的其他用途或额外收集未提及的其他个人信息,我们会另行事先请您同意(确认同意的方式:如勾选、弹窗、站内信、邮件、短信等方式)。一旦您同意,该等额外用途将视为本《隐私政策》的一部分,该等额外个人信息也将适用本《隐私政策》。

    征得授权同意的例外

    根据相关法律法规规定,以下情形中收集您的个人信息无需征得您的授权同意:

    1. 与国家安全、国防安全有关的;
    2. 与公共安全、公共卫生、重大公共利益有关的;
    3. 与犯罪侦查、起诉、审判和判决执行等有关的;
    4. 出于维护个人信息主体或其他个人的生命、财产等重大合法权益但又很难得到您本人同意的;
    5. 所收集的个人信息是您自行向社会公众公开的;
    6. 从合法公开披露的信息中收集个人信息的,如合法的新闻报道、政府信息公开等渠道;
    7. 根据您的要求签订合同所必需的;
    8. 用于维护思源笔记云端服务的安全稳定运行所必需的,例如发现、处置产品或服务的故障;
    9. 为合法的新闻报道所必需的;
    10. 学术研究机构基于公共利益开展统计或学术研究所必要,且对外提供学术研究或描述的结果时,对结果中所包含的个人信息进行去标识化处理的;
    11. 法律法规规定的其他情形。
    12. 您理解并同意,思源笔记云端服务可能需要您在您的设备中开启特定的访问权限(例如您的位置信息 、摄像头、相册、麦克风、通讯录及/或日历),以实现这些权限所涉及个人信息的收集和使用。当您需要关闭该功能时,大多数移动设备都会支持您的这项需求,具体方法请参考或联系您移动设备的服务商或生产商。请您注意,您开启任一权限即代表您授权我们可以收集和使用相关个人信息来为您提供对应服务,您一旦关闭任一权限即代表您取消了授权,我们将不再基于对应权限继续收集和使用相关个人信息,也无法为您提供该权限所对应的服务。但是,您关闭权限的决定不会影响此前基于您的授权所进行的个人信息收集及使用。
    13. 有关敏感个人信息的提示。

    以上由您提供或我们收集您的个人信息中,可能包含您的个人敏感信息,例如银行账号、交易和消费记录、虚拟财产信息、系统账号、邮箱地址及其有关的密码、电话号码、网页浏览记录、位置信息。请您谨慎并留意个人敏感信息,您同意您的个人敏感信息我们可以按本《隐私政策》所述的目的和方式来处理。

    二、我们如何使用 Cookies 或同类技术

    我们或我们的第三方合作伙伴可能通过 Cookies 获取和使用您的个人信息,并将该等个人信息储存为日志信息。

    通过使用 Cookies,我们才能记住您的账号身份。一个 Cookies 是少量的数据,它们从一个网络服务器送至您的浏览器并存在计算机硬盘上。我们使用 Cookies 是为了让您可以受益。比如,为使得思源的登录过程更快捷,您可以选择把用户名存在一个 Cookies 中。这样下次当您要登录思源的服务时能更加方便快捷。Cookies 能帮助我们确定您连接的页面和内容,节省您在思源笔记云端服务上花费的时间。

    Cookies 使得我们能更好、更快地为您服务。然而,您应该能够控制 Cookies 是否以及怎样被你的浏览器接受。请查阅您的浏览器附带的帮助以获得更多这方面的个人信息。

    我们和第三方合作伙伴可能通过 Cookies 收集和使用您的个人信息,并将该等个人信息储存。

    我们使用自己的 Cookies,可能用于以下用途:

    1. 记住您的身份。例如:Cookies 有助于我们辨认您作为我们的注册用户的身份,或保存您向我们提供有关您的喜好或其他个人信息;
    2. 分析您使用我们服务的情况。我们可利用 Cookies 来了解您使用思源笔记云端服务进行什么活动、或哪些服务或服务最受欢迎;

    您可以通过浏览器或用户选择机制拒绝或管理 Cookies。但请您注意,如果您停用 Cookies,我们有可能无法为您提供最佳的服务体验,某些服务也可能无法正常使用。

    三、我们可能分享、转让或披露的个人信息

    分享

    除以下情形外,未经您同意,我们不会与我们及我们的关联方之外的任何第三方分享您的个人信息:

    1. 向您提供我们的服务。我们可能向合作伙伴及其他第三方分享您的个人信息,以实现您需要的核心功能或提供您需要的服务,例如:向短信服务商提供对应的手机号码;
    2. 维护和改善我们的服务。我们可能向合作伙伴及其他第三方分享您的个人信息,以帮助我们为您提供更有针对性、更完善的服务,例如:代表我们发出电子邮件或推送通知的通讯服务提供商等;
    3. 实现本《隐私政策》第一条“我们如何收集和使用您的个人信息”部分所述目的;
    4. 履行我们在本《隐私政策》或我们与您达成的其他协议中的义务和行使我们的权利;
    5. 在法律法规允许的范围内,为了遵守法律、维护我们及我们的关联方或合作伙伴、您或其他思源用户或社会公众利益、财产或安全免遭损害,比如为防止欺诈等违法活动和减少信用风险,我们可能与其他公司和组织交换个人信息。不过,这并不包括违反本《隐私政策》中所作的承诺而为获利目的出售、出租、共享或以其它方式披露的个人信息。
    6. 应您合法需求,协助处理您与他人的纠纷或争议;
    7. 应您的监护人合法要求而提供您的个人信息;
    8. 根据与您签署的单项服务协议(包括在线签署的电子协议以及相应的平台规则)或其他的法律文件约定所提供;
    9. 基于学术研究而提供;
    10. 基于符合法律法规的社会公共利益而提供。

    我们仅会出于合法、正当、必要、特定、明确的目的共享您的个人信息。对我们与之共享个人信息的公司、组织和个人,我们会与其签署严格的保密协定,要求他们按照我们的说明、本《隐私政策》以及其他任何相关的保密和安全措施来处理个人信息。

    转让

    1. 随着我们业务的持续发展,我们有可能进行合并、收购、资产转让或类似的交易,而您的个人信息有可能作为此类交易的一部分而被转移。我们会要求新的持有您个人信息的公司、组织继续受本《隐私政策》的约束,否则,我们将要求该公司、组织重新向您征求授权同意。
    2. 在获得您的明确同意后,我们会向其他方转让您的个人信息。

    披露

    我们仅会在以下情况下,且采取符合业界标准的安全防护措施的前提下,才会披露您的个人信息:

    1. 根据您的需求,在您明确同意的披露方式下披露您所指定的个人信息;
    2. 根据法律、法规的要求、强制性的行政执法或司法要求所必须提供您个人信息的情况下,我们可能会依据所要求的个人信息类型和披露方式披露您的个人信息。在符合法律法规的前提下,当我们收到上述披露个人信息的请求时,我们会要求接收方必须出具与之相应的法律文件,如传票或调查函。我们坚信,对于要求我们提供的个人信息,应该在法律允许的范围内尽可能保持透明。我们对所有的请求都进行了慎重的审查,以确保其具备合法依据,且仅限于执法部门因特定调查目的且有合法权利获取的数据。

    分享、转让、披露个人信息时事先征得授权同意的例外

    以下情形中,分享、转让、披露您的个人信息无需事先征得您的授权同意:

    1. 与国家安全、国防安全有关的;
    2. 与公共安全、公共卫生、重大公共利益有关的;
    3. 与犯罪侦查、起诉、审判和判决执行等司法或行政执法有关的;
    4. 出于维护您或其他个人的生命、财产等重大合法权益但又很难得到本人同意的;
    5. 您自行向社会公众公开的个人信息;
    6. 从合法公开披露的信息中收集个人信息的,如合法的新闻报道、政府信息公开等渠道。

    根据法律规定,共享、转让经去标识化处理的个人信息,且确保数据接收方无法复原并重新识别个人信息主体的,不属于个人信息的对外共享、转让及公开披露行为,对此类数据的保存及处理将无需另行向您通知并征得您的同意。

    我们如何保留、储存和保护您的个人信息安全

    我们仅在本《隐私政策》所述目的所必需期间和法律法规及监管规定的时限内保存您的个人信息。如我们终止服务或运营,我们将及时停止继续收集您个人信息的活动,同时会遵守相关法律法规要求提前向您通知,并在终止服务或运营后对您的个人信息进行删除或匿名化处理,法律法规或监管部门另有规定的除外。

    我们在中华人民共和国境内运营中收集和产生的个人信息,存储在中国境内。以下情形除外:

    1. 法律法规有明确规定;
    2. 获得您的授权同意;
    3. 您使用思源笔记云端服务,且需要向境外传输您的个人信息完成交易的;

    针对以上情形,我们会确保依据本《隐私政策》及国家法律法规要求对您的个人信息提供足够的保护。

    我们非常重视个人信息安全,我们将采取一切合理可行的措施,保护您的个人信息:

    数据安全技术措施

    我们会采用符合业界标准的安全防护措施,包括建立合理的制度规范、安全技术来防止您的个人信息遭到未经授权的访问使用、修改,避免数据的损坏或丢失。网络服务采取了多种加密技术,例如在某些服务中,我们将利用加密技术(例如 SSL)来保护您的个人信息,采取加密技术对您的个人信息进行加密保存,并通过隔离技术进行隔离。 在个人信息使用时,例如个人信息展示、个人信息关联计算,我们会采用多种数据脱敏技术增强个人信息在使用中的安全性。采用严格的数据访问权限控制和多重身份认证技术保护个人信息,避免数据被违规使用。

    1. 我们为保护个人信息采取的其他安全措施:

      1. 我们通过建立数据例行备份制度、数据分类分级制度、数据安全管理规范、数据安全开发规范来管理规范个人信息的存储和使用。
      2. 我们通过个人信息接触者保密协议、监控和审计机制来对数据进行全面安全控制。并对个人信息接触者所有操作过程进行记录,以便遇到泄露时方便回溯。
      3. 我们仅允许有必要知晓这些个人信息的我们及我们关联方的员工、合作伙伴访问您的个人信息,并为此设置了严格的访问权限控制和监控机制。我们同时要求可能接触到您的个人信息的所有人员履行相应的保密义务。如果未能履行这些义务,可能会被追究法律责任或被中止与我们的合作关系。
    2. 互联网并非绝对安全的环境,而且电子邮件、即时通讯、社交软件或其他服务软件等与其他用户的交流方式无法确定是否完全加密,我们建议您使用此类工具时请使用复杂密码,并注意保护您的个人信息安全。

    3. 我们将尽力确保或担保您发送给我们的任何个人信息的安全性。如果我们的物理、技术、或管理防护设施遭到破坏,导致个人信息被非授权访问、公开披露、篡改、或毁坏,导致您的合法权益受损,我们将承担相应的法律责任。

    安全事件处置

    在不幸发生个人信息安全事件后,我们将按照法律法规的要求,及时向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们同时将及时将事件相关情况以邮件、信函、短信、电话、推送通知等方式告知您,难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告。同时,我们还将按照监管部门要求,主动上报个人信息安全事件的处置情况。

    请您理解,由于技术的限制以及风险防范的局限,即便我们已经尽量加强安全措施,也无法始终保证个人信息百分之百的安全。您需要了解,您接入思源笔记云端服务所用的系统和通讯网络,有可能因我们可控范围外的情况而发生问题。

    四、如何管理您的个人信息

    我们鼓励您更新和修改您的个人信息以使其更准确有效,也请您理解,您更正、删除、撤回授权或停止使用思源笔记云端服务的决定,并不影响我们此前基于您的授权而开展的个人信息处理。除法律法规另有规定,当您更正、删除您的个人信息或申请注销账号时,我们可能不会立即从备份系统中更正或删除相应的个人信息,但会在备份更新时更正或删除这些个人信息。

    您可以通过以下方式来管理您的个人信息:

    访问、更正和删除您的个人信息

    您能通过思源笔记云端服务访问您的个人信息,并根据对应个人信息的管理方式自行完成或要求我们进行访修改、补充和删除。我们将采取适当的技术手段或提供提交申请的联系渠道,尽可能保证您可以访问、更新和更正自己的个人信息或使用思源笔记云端服务时提供的其他个人信息。

    在访问、更正和删除前述个人信息时,我们可能会要求您进行身份验证,以保障个人信息安全。对于通过 Cookies 或同类技术收集的您的个人信息,我们还在本《隐私政策》第二条“我们如何使用 Cookies 或同类技术”部分说明了向您提供的选择机制。如果您无法通过上述路径访问、更正该等个人信息,您可以通过本《隐私政策》第八条“如何联系我们”约定的联系方式与我们取得联系。对于您在使用思源笔记云端服务过程中产生的其他个人信息需要访问、更正或删除,我们会根据本《隐私政策》所列明的方式、期限及范围来响应您的请求。在部分个人信息删除时,我们可能会要求您进行身份验证,以保障个人信息安全。

    在以下情形中,您可以向我们提出删除个人信息的请求:

    1. 如果我们处理个人信息的行为违反法律法规;
    2. 如果我们收集、使用您的个人信息,却未征得您的授权同意;
    3. 如果我们处理个人信息的行为严重违反了与您的约定;
    4. 如果我们不再为您提供思源笔记云端服务。

    若我们决定响应您的删除请求,我们还将同时尽可能通知从我们处获得您的个人信息的实体,要求其及时删除,除非法律法规另有规定,或这些实体获得您的独立授权。

    公开与分享

    我们的多项服务可让您不仅与您的社交网络、也与使用该服务的所有用户公开分享您的相关个人信息,例如,您在思源笔记云端服务中所上传或发布的个人信息、您对其他人上传或发布的个人信息作出的回应,通过电子邮件或在思源笔记云端服务中不特定用户可见的公开区域内上传或公布您的个人信息,以及包括与这些个人信息有关的位置数据和日志信息。只要您不删除您所公开或共享的个人信息,有关个人信息可能一直留存在公众领域;即使您删除共享个人信息,有关个人信息仍可能由其他用户或不受我们控制的第三方独立地缓存、复制或储存,或由其他用户或该等第三方在公众领域保存。如您将个人信息通过上述渠道公开或共享,由此造成您的个人信息泄露,我们不承担责任。因此,我们提醒并请您慎重考虑是否通过上述渠道公开或共享您的个人信息。

    改变您授权同意的范围

    您总是可以选择是否披露个人信息。有些个人信息是使用思源笔记云端服务所必需的,但大多数其他个人信息的提供是由您决定的。您可以通过删除个人信息、关闭设备功能等方式改变您授权我们继续收集个人信息的范围或撤回您的授权。

    当您撤回授权后,我们无法继续为您提供撤回授权所对应的服务,也不再处理您相应的个人信息。但您撤回授权的决定,不会影响此前基于您的授权而开展的个人信息处理。

    注销你的账户

    如您需要注销账户,请登录链滴,进入 设置 - 账号 自行停用。

    在注销账户之后,我们将停止为您提供产品或服务,并依据您的要求,删除您的个人信息,但法律法规另有规定的除外。

    获取个人信息副本

    您有权获取您的个人信息副本,您可以通过以下方式自行操作:登录 思源 网页端,进入「设置」-「账号详情」-「导出」。我们会在 24 小时内为你生成全部个人信息副本的下载链接。

    五、第三方 SDK 服务

    思源笔记云端服务可能链接至第三方提供的社交媒体或其他服务(包括网站或其他服务形式),包括:

    1. 您可利用“分享”键将某些内容分享到第三方平台(如微信),或您可利用第三方服务登录思源笔记云端服务。这些功能可能会收集您的个人信息(包括您的日志信息),并可能在您的电脑装置 Cookie,从而正常运行上述功能;
    2. 我们通过广告或我们服务的其他方式向您提供链接,使您可以接入第三方的服务或网站;
    3. 其他接入第三方服务的情形。

    以上第三方社交媒体或其他服务由相关的第三方负责运营。若您需要使用以上这些第三方的社交媒体服务或其他服务(包括您向该等第三方提供的任何个人信息)时,须受第三方自己的服务条款及个人信息保护声明(而非本《隐私政策》)约束,请仔细阅读其条款。本《隐私政策》仅适用于“思源”所收集的任何个人信息,并不适用于任何第三方提供的服务或第三方的个人信息使用规则,而我们对任何第三方使用由您提供的个人信息不承担任何责任。

    下面是详细 SDK 情况说明:

    社交类服务 SDK:

    SDK 名称:微信开放平台

    公司名称:腾讯科技(深圳)有限公司

    SDK 官网:https://open.weixin.qq.com (opens new window)

    使用目的:用于帮助用户分享内容至微信

    收集的个人信息类型/字段:设备标识信息 https://open.weixin.qq.com/cgi-bin/frame?t=news/protocol_developer_tmpl

    开发类服务 SDK:

    SDK 名称:Sentry

    公司名称:FUNCTIONAL SOFTWARE, INC.

    SDK 官网:https://sentry.io

    使用目的:用于收集报错信息和诊断数据,进而改善用户体验

    收集的个人信息类型/字段:设备标识信息和报错日志、诊断数据等不涉及个人隐私的数据 https://sentry.io/privacy/

    SDK 名称:Google Analytics

    公司名称:Google

    SDK 官网:https://analytics.google.com

    使用目的:用于收集统计信息,进而改善用户体验

    收集的个人信息类型/字段:程序信息和账号订阅状态等不涉及个人隐私的数据 https://policies.google.com/privacy

    六、应用内会申请的权限

    我们需要申请部分涉及个人隐私的系统权限,确保应用内某些功能可以正常使用。我们会在您使用这些功能时,向您申请授权,明确获得您的授权后,我们才会访问您的个人信息。若您不需要使用这些功能,可以拒绝授权;若您从未使用过这些功能,我们不会向您申请权限、也不会访问您的个人信息。

    我们会申请的权限及这些权限对应的功能包括:

    Android 应用会申请的权限允许访问网络:

    • 允许访问网络: 当您安装应用时,我们会申请此权限。
    • 允许常驻通知: 当您安装应用,我们会申请此权限。
    • 允许获取应用列表: 当您安装应用时,我们会申请此权限。
    • 允许拍照/访问相册: 当您希望添加照片时,我们会申请此权限。

    iOS 应用内会申请的权限

    • 允许访问网络: 当您安装应用时,我们会申请此权限。
    • 允许访问系统相册: 当您希望添加照片时,我们会申请此权限。

    七、隐私政策的通知和修订

    我们可能适时修改本《隐私政策》的条款,该等修改构成本《隐私政策》的一部分。对于重大变更,我们会提供更显著的通知,您如果不同意该等变更,可以选择停止使用思源笔记云端服务;如您仍然继续使用思源笔记云端服务的,即表示同意受经修订的本《隐私政策》的约束。

    我们鼓励您在每次使用思源笔记云端服务时都查阅我们的隐私政策。

    我们可能在必需时(例如当我们由于系统维护而暂停某一项服务时)发出与服务有关的公告。您可能无法取消这些与服务有关、性质不属于推广的公告。

    最后,您必须对您的账号和密码信息负有保密义务。任何情况下,请小心妥善保管。

    八、如何联系我们

    请发送邮件到 845765@qq.com。

    用户协议

    • 发布日期:2022 年 2 月 11 日
    • 最新日期:2022 年 5 月 26 日

    思源笔记使用 AGPLv3 开源协议,请务必遵循。

    // This program is free software: you can redistribute it and/or modify
    // it under the terms of the GNU Affero General Public License as published by
    // the Free Software Foundation, either version 3 of the License, or
    // (at your option) any later version.
    //
    // This program is distributed in the hope that it will be useful,
    // but WITHOUT ANY WARRANTY; without even the implied warranty of
    // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    // GNU Affero General Public License for more details.
    //
    // You should have received a copy of the GNU Affero General Public License
    // along with this program. If not, see https://www.gnu.org/licenses/.

    对于思源笔记云端服务,禁止共享用户账号,否则账号会被停用。 ↩︎

  64. 致谢

    思源的诞生离不开众多的开源项目和贡献者,请参考项目源代码 kernel/go.mod、app/package.json 和项目首页。

    思源的成长离不开用户的反馈和宣传推广,感谢所有人对思源的帮助 ❤ ↩︎

posted @ 2026-01-31 22:20  ArthasJian  阅读(2)  评论(0)    收藏  举报