English version

最近做了一个新的开源项目,叫留白(LeftBlank)。这是一个基于 Typst 的 macOS 写作工具,可以用来写文章、技术笔记,也可以写比较长的文档。程序免费,代码也开源,目前已经有一个可以下载使用的开发预览版。

我平常主要做后端开发,这次做一个桌面软件,有不少东西需要重新学习。这篇文章介绍一下留白现在能做什么,以及之前用 Emacs 时接触到的一些设计,怎么影响了这个项目。

留白的写作界面:左侧编辑 Typst 源文档,右侧显示排版结果

背景⌗

写文档时通常有两件事要做,一件是把内容写清楚,另一件是把页面排好。对于技术文档,公式、表格、代码和图片又会增加一些工作。Markdown 很适合记笔记,但是需要控制页面布局的时候,就得再找其他工具。

Typst 提供了一个挺好的选择。它是一个基于文本的排版系统,文档本身是普通的源文件,可以用标记和函数来描述内容与样式,再编译成 PDF。下面就是一个简单的例子:

= 一份技术笔记

这里可以写普通的文字,也可以写公式:

$ f(x) = x^2 + 1 $

#table(
  columns: 2,
  [项目], [说明],
  [编辑器], [留白],
  [排版引擎], [Typst],
)

可以看到,文字、公式和表格都放在同一个文档里。需要更复杂的功能时,还可以使用 Typst Universe 里的包,比如画图或者给代码块加上行号。

有了排版引擎,编辑器还有很多可以做的事。比如怎么方便地找到一个命令,怎么在源文档和页面之间跳转,怎么让一篇长文章读起来更舒服。留白主要想把这些日常使用的问题处理好,让写作和看排版结果可以在一个程序里完成。

从 Spacemacs 和 which-key 学到的东西⌗

我在 2020 年写过一篇 Spacemacs 的介绍。当时那篇文章很简单,主要列了一些常用的操作和按键。其中一个我很喜欢的设计,就是按下前缀键以后,可以看到接下来有哪些命令可以用。

编辑器的功能越来越多,快捷键也会越来越多。平常经常用的几个很好记,但是偶尔才用一次的功能,下次需要的时候很可能就忘了。Spacemacs 和 which-key 的做法很实用:把命令按用途分组,每按一步,都提示下一步能做什么。

留白也采用了类似的方式。按下 ⌘J 会打开命令面板,然后可以按照提示继续选择。例如插入一个表格:

  1. 按 ⌘J 打开命令面板。
  2. 按 i 进入插入分组。
  3. 按 t 插入表格。

如果不知道一个功能属于哪个分组,可以按 / 搜索所有命令。常用的操作也有直接快捷键,用熟之后就可以直接执行。

留白的命令面板,按用途展示命令分组和下一步按键提示

个人觉得,这样比让用户先看一遍快捷键文档更容易上手。刚开始可以跟着提示找功能,使用几次之后,自然就能记住常用的操作。

Org-mode 和 nano-emacs 的影响⌗

Org-mode 给我的一个启发是,普通文本也可以有很好的阅读和编辑体验。标题可以有层次,文章可以按大纲组织,文字本身仍然是能直接打开和修改的文件。留白的编辑器也保留了这个思路。

在编辑区,标题、强调和行内代码会有相应的样式。光标进入一段文字时,会显示这一段的源文本标记,方便修改。旁边的大纲可以用来找到章节,文档长了以后不用一直滚动。

这些显示效果不会改掉原来的 Typst 源文件。保存和复制的仍然是原始文本,也可以导出源文件,继续用其他编辑器修改。

nano-emacs 对界面的影响也很大,特别是主题的颜色、间距和整体的简洁感。留白提供了浅色和深色外观,写作时可以只看编辑区,需要检查页面时再切到分栏或者预览。希望能把内容放在比较显眼的位置,让界面少占一些注意力。

实现和一些日常功能⌗

留白使用 SwiftUI 和 AppKit 开发,编辑部分基于 macOS 原生文本控件。Typst 的语言服务和实时预览通过 Tinymist 提供,排版在本机运行。需要的组件随程序一起打包,所以下载之后不用再单独安装 Typst。

留白中包含公式、代码和表格的技术笔记,以及对应的实时排版预览

编辑和预览之间也做了一些配合。双击预览里的内容,可以跳到对应的源文档位置;在源文档里选中一段内容,也可以定位到页面里。这样检查一张表格或者一个公式的时候,不用在两个窗口里分别找。

除了编辑器,还有几个现在已经可以使用的功能:

  1. 浏览 Typst Universe 的模板和包,查看文档,并插入带有明确版本的 import。
  2. 自动保存,以及本机的源文档历史,可以比较和恢复之前保留的版本。
  3. 导入现有的 .typ 文件或者项目文件夹,继续编辑已经写好的内容。
  4. 导出 PDF,也可以导出可以继续修改的 Typst 源文档。

文档历史保存在本机,记录的是源文本。项目里的图片等其他文件,还是需要另外做好备份。

当前版本⌗

目前发布的是开发预览版,支持 macOS 14 及以上版本,需要 Apple silicon 的 Mac,界面支持中文和英文。功能还在继续完善,长文档编辑、中文输入和预览之间的配合,都需要在实际使用中继续打磨。

下载、源码和可以编辑的示例都放在 留白的官网 上。感兴趣的朋友可以下载试一下,也欢迎提 issue,告诉我哪些地方不好用,或者有哪些功能值得继续做。

之前做开源项目的时候,有不少改进都是从其他人的使用和反馈里来的。希望留白也能慢慢变成一个大家愿意日常使用的工具。也感谢 Typst、Tinymist,以及 Emacs 社区提供的实现和想法,这个项目从它们身上学到了很多东西。