把熟悉的操作带回来:快捷键和 Markdown 预览

5 阅读3分钟

把熟悉的操作带回来:快捷键和 Markdown 预览

窗口和预览包有了之后,砚继续补一些每天会碰到的功能。这一篇放在一起的两件事,是自定义快捷键和 Markdown 预览。

它们都和“熟悉感”有关:已经形成的按键习惯能不能带进来,一份文档能不能舒服地看完。

支持熟悉的配置格式

砚新增了 keybindings.json,沿用 VS Code 的配置形状。文件菜单可以打开它,在砚里保存后重新加载。

例如下面是一条编辑器有焦点时保存的绑定:

[
  {
    "key": "ctrl+alt+s",
    "command": "workbench.action.files.save",
    "when": "editorTextFocus"
  }
]

实际解析还支持注释和尾逗号,也就是常见的 JSONC 写法。连按如 cmd+k cmd+s、命令名前加 - 移除绑定,以及 runCommands 组合命令也纳入了支持范围。

前期沿用命令 ID 的决定,到这里开始减少适配成本。用户不必为相同的保存或切换动作,再记一套完全不同的名字。

兼容格式,需要同时交代边界

when 不是一个装饰字段。只有焦点在编辑区时生效的键,不能在搜索输入框里也抢走输入。

砚把支持的条件映射到全局、编辑器、树和浮层上下文,并处理系统条件。未知条件、未知命令或不支持的参数会产生提示,不能假装整份 VS Code 配置都已生效。

目前也没有完整覆盖终端焦点、依赖选区等动态状态的条件;除 runCommands 外的带参数命令存在限制。外部程序改了这个配置,也不能把“在砚里保存立即生效”扩展理解成已有持续监听。

做兼容时,我更愿意说明支持的子集。用户知道某条配置为什么被跳过,比按了半天不知道被谁吞掉要好排查。

快捷键还要留下跨平台入口

虽然当前发的是 macOS 窗口预览版,命令和菜单不能把平台符号写死在所有地方。

砚通过 keymap.Profile.OS 和平台辅助函数处理键位,以及文件管理器、回收站的叫法。这里打通的是接口和文案入口,并不意味着 Windows、Linux 的窗口版已经发行。

把这件事提前放到共同层里,后续移植时才不用逐页找“Cmd”和“访达”。

Markdown 从源码视图切到阅读视图

窗口版用 Cmd+Shift+V 在 Markdown 文本与预览之间切换,延续了已有 SVG 预览的入口。

目前支持标题、列表和任务列表、引用、代码高亮、表格、本地图片与链接等常用内容。可以把同一文件放在另一栏,一边编辑,一边看预览更新。网页链接交给浏览器,本地链接在砚里打开。

解析和显示由窗口层处理,内核提供文本与版本。后台解析完成时仍要确认对应版本有效,避免快速输入时把旧文档渲染回来。这和搜索里的异步有效期问题很相似。

看的是预览,就不能改隐藏的源码

这次顺便修了一个很容易被忽略的交互:标签显示 SVG 或 Markdown 预览时,键盘输入不能继续修改背后的隐藏文本。

否则用户眼前没看见编辑内容,文件却已经变脏,自动保存还可能把它写出去。现在会提示先切回文字视图。

预览当前也有明确边界:文字栏和预览栏没有滚动同步,面包屑里的专用预览按钮还没补上。这是阅读预览,也不等于 Markdown 所见即所得编辑器,更没有据此宣称支持 Mermaid 或数学公式渲染。

这批功能进入 alpha.4。到这一步,砚越来越适合原来的核心场景:在代码和中文文档之间切换,做一点编辑,再继续往下读。