原样保留手工输入表格的表格编辑功能
你是否遇到过只改了表格中的一个词,git diff 却显示整个表格都发生了变化?表格是 Markdown 中最容易出现错位的地方。

Markdown 表格中会留下手工调整的痕迹。把竖线排列整齐,用空格调整单元格的宽度,有时还会故意打乱对齐。这个样子本身就是文件的原文。
但是,以网格形式显示表格的编辑器需要解析原文。重新保存时,如果自动对齐表格,人为排出的样子也会改变。
Typora 的表格自动对齐就是一个广为人知的例子。为了统一列宽,它会用空格填充竖线之间的区域,并将结果写入保存的文件。这个问题已经整理成公开 issue,另外也有人提出希望能通过选项将其关闭。
mote 决定不这样做。屏幕上以网格形式显示表格,但文件中仍原样保留手写的原文。
只有正在修改的单元格会显示原文
在实时模式中点击表格,网格仍保持原样。只有光标所在的单元格会变成原文,竖线符号会淡淡地显示出来。
可以用 Tab 或方向键移动到其他单元格。在最后一行按 Enter,会生成新的一行。
选择操作也很自然。在单元格内拖动,只会选中文字。拖到单元格外时,多个单元格会以矩形区域被选中;复制后,只有选中的单元格会被制成表格。第一行会成为表头,对齐方式也会保留。
如果从表格外开始的选择触及表格,整个表格都会被选中。不会别扭地只选中一半表格。
行和列也可以整体移动。将鼠标移到表格上时,行的左侧和列的上方会出现拖动手柄。拖到想要的位置即可。
在右键菜单中可以添加或删除行和列。所有操作都会作为一次编辑处理,因此可以一次撤销。没有碰过的单元格原文不会改变。同样的功能也可以在命令面板中找到。

因为一条竖线,表格塌了
最初,在表格内输入竖线时,总是会在前面加上反斜杠。因为当时只考虑了在单元格中输入竖线字符的情况。
但是,对于直接编写 Markdown 表格的人来说,竖线是分隔单元格的符号。输入新行时,连分隔符也会变成普通字符,表格就塌了。
所以后来改成了根据输入位置进行判断。
在一行开头的位置输入竖线时,会忽略它。如果后面已经有分隔符,就把光标移到下一个单元格。只有在单元格内的句子中输入竖线时,才会对它进行转义。在表格正下方写入以竖线开头的行时,则会接续为现有表格的新行。
这种问题很难只看代码发现。所以我们制作了在实际窗口中点击表格并拖动手柄的测试。测试会确认表格是否正确绘制、行和列是否按预期方向移动,以及应用是否会在此过程中崩溃。
保存后,结果会显示得更清楚。如果只修改一个单元格中的一个词,git diff 中也只会出现那一行。
用于对齐列的空格、项目符号的星号、行尾的两个空格也都会原样保留。如果文件原本没有最后的换行符,连这个状态也会保持不变。在状态栏中,可以立即看到保存时改变了多少字节。

也有做出来后又移除的功能
有一段时间,可以用鼠标调整列宽。现在已经没有这个功能了。
Markdown 没有保存列宽的语法。要记住宽度,就必须在文档旁边创建单独的文件。这样一来,那个文件夹只有在有 mote 的情况下才是完整的。通过 git 移动、在其他设备上打开,或者使用其他编辑器时,这些信息就会丢失。
表格边框则通过应用设置解决。可以选择显示为完整网格,或只在表头下方画线。同样的设置也会应用于屏幕显示以及 PDF、HTML 导出。
标准很简单。无法写入 Markdown 的值,要么放在应用设置中,要么就不把它做成功能。
所以我们移除了调整列宽的功能。列宽会根据内容自动确定。文档从始至终都只保留为一个 .md 文件。
一种编辑器会把表格重新写得漂亮,另一种编辑器会原样守护我写下的表格。
mote 选择了后者。