article_image

本系列原名“开箱即用”,以取轻而不佻之意,惟“开箱即用”“用完就走”“够用”在中文语境下已严重劣化,沦为广告商推卸责任的托辞。遂重拾原稿中的命名,更为“工具论ABC”。

“工具论”——泛指抽象方法和具体器物——显然攀附亚里士多德和培根,“ABC”——入门而不浅尝辄止、不求甚解——则是假借罗素的《相对论ABC》。区区杂文,如此枘凿,固然只是游戏之举,惟望读者能够一窥“工具”和“ABC”两层含义。

现在,一个混蛋给你发了一封用伪 Markdown 语法写的文档,里面有一个有序列表,但是英文句号和列表项目之间没有空格,导致这团玩意儿没法被正常渲染。请用最快的速度把遗漏空格的文本变成正确的 Markdown 格式。

Alt text
遗漏空格的 Markdown 列表无法正常渲染

方法有很多,包括写一段正则表达式、使用通配符、打开 Vim 或者求助于万能的 Excel,但可能还有更简单、更干脆的方法:列编辑,也称列选择(Column Selection)

Alt text
在列编辑模式下批量添加空格

什么是列编辑

在事实上,列编辑属于程序员的私货,因而关于它的讨论,一般都是从某个具体编辑器谈起,比如 Sublime Text、Vim 或 VSCode,这一下子把不相关的用户拦在门外;即便是这些编辑器的用户,恐怕也只会在遇到某个非常细致的操作时才遇上列编辑,并且是作为一种 hack,而不是常用方法。我虽然不得不从代码编辑开始,但最终尝试将列编辑提升为通用方法。

Sublime Text 对列编辑(选择)的定义比较准确:选中一个矩形区域内的文本,并编辑它们。来看一个直观的对比:

  1. 普通模式下,选择文本是逐行进行;
  2. 列编辑中,则是按住 ‌⌥Option 键,然后用光标拉出一个矩形选框,选中框内的文本。

几乎每个编辑器都支持列编辑(只是程度不同),包括 macOS 的自带文本编辑器,你可以现在将往里面丢一段文本,然后按住 ‌⌥Option 去选一下试试。普通人的第一反应可能是绝对挺好玩,但稍微多几次就甩手不管:这又有什么用呢?答案是,凡举排列整齐的文本,就可以用列编辑降低操作量。下面是几个简单的例子:

**例子一:批量删除多余空格。**网上很多文章,都是用多个空格来代替缩进,导致你复制到本地后会在每一段开头都看见一串儿空行。也许你可以写一段通配符来移除它们,但简单的方法是在列编辑模式下选中开头的空行,然后一次性将其删除。

Alt text
例子一:批量删除空格

**例子二:删除文本前缀。**有时候,需要移除的文本并不在段落开头,而是夹在中间,此时正则表达式和通配符可能更难写,但列编辑仍然值得一试。从表格复制文字时,经常会有几列用不上的数据,有时候偏偏就是夹在中间那一列,此时就可以试试列编辑,把它们圈出来并删掉。

Alt text
例子二:删除文本前缀

可见,虽然名为“列编辑”,其实这一操作的精髓实为跨行编辑,一次性在多行文本的固定位置执行操作。以上的例子均为删除多余文本,因为不同编辑器对列编辑的支持程度参差不齐,删除是最简单而通用的;下面,我们来看更高级的操作——很幸运。它们全部可以在免费编辑器的找到。

不同编辑器中的列编辑

根据选中文本之后的行为,列编辑下涉及的操作可以分为删除文本输入文本组合文本,而多数编辑器——包括我正在用于撰写本文的 iA Writer——只支持批量删除。如果你试着在一般的编辑器中打字或粘贴文本,通常也只能改动第一行,无法实现跨行、多行编辑的效果。

好在多数涉及代码的编辑器,都对列编辑青睐有加,有进一步的支持。下面的例子以 BBEdit 为主,这款软件有几十年的开发历史,核心功能均免费,而且比起 IDE(Integrated Development Environment,整合开发环境)来不那么 Geek,不懂代码的人也可以上手。

相比系统自带的文本编辑器,BBEdit 首先支持跨行输入。一般的编辑器,即便进入列编辑模式,也只能在第一行输入文本1,而 BBEdit 则可以同时在每一行中插入文本——只可惜,暂时不能用中文输入法,不过列编辑本来就常用于插入数字或符号,问题估计不大。比如,有几行文本,如果想把它们变成 Markdown 格式的无序列表,最简单的方法就是在 BBEdit 列编辑模式中批量添加符号:先按住 ‌⌥Option,选中文本开头的位置,然后输入 - ,BBEdit 即可在选中的行前面加上项目符号和空格,将其变为 Markdown 列表。

Alt text
例子三:批量插入文本

除了跨行输入文本,BBEdit 还可以跨行组合文本,例言之,如果你选中了三行,而剪贴板里的文本也有三行,那么在列编辑模式下粘贴时,剪贴板中的每一行就会和选中文本中的每一行一一组合,就像在使用 Excel 表格一样。这一性质可以用于创建简单的表格,而不需要真的开启 Excel 等厚重的工具。我会在下一节介绍一个具体例子。

另外,包括 BBEdit 在内,部分编辑器——主要有 Sublime Text、VSCode 以及人见人爱的 Obsidian——还能正确处理换行,如果某一段比较长、超出了一行,那么从第二行开始都不会被选中。当处理比较长的列表项时,这样的细节会让人会心一笑。

Alt text
Obsidian 可以跨行进行列编辑

快速复制图片中的表格

比较敏感的读者可能发现,列编辑是基于位置的,似乎可以用来处理表格。事实正是如此。本节我以 BBEdit 为例,展示如何利用列编辑,快速把图片中表格复制为文本。

图片转表格本身是一个比较重要的功能,Office Lens 和白描都将其作为主打项,但先撇开这些更擅长扫描的软件不谈,眼下的问题是:已经有一张表格的图片,怎样将表格数据从中快速复制出来?有人可能会搬出自己如数家珍的 OCR 工具,而熟悉 Live Text 的人可能会直接打开图片尝试复制文本。但效果往往和你想象得不同:多数 OCR 工具不会给你一份表格,而是每一格就换一行,导致文本都不在同一行,效果很差。2

Alt text
直接从图片中复制的文本存在换行问题

列编辑固然不是万金油,但面对数据格式整齐的表格——最重要的是,字符长度相当,这样才能正确识别“列”——它可以一试身手。接着刚刚提取的文本,很容易发现,其实文本顺序没有被完全打乱,只需要将图中汉字部分的每一行和数字部分的对应行拼起来,就可以还原表格数据。会用 Excel 的朋友可能已经跃跃欲试了,但先别急:试一试列编辑。

  1. 复制汉字部分,确保汉字部分的行数和数字部分一样;
  2. 按住 ‌⌥Option 键,选中数字部分每一行的开头或结尾;
  3. 按下 ‌⌘Command-V 粘贴汉字部分,因为当前是列编辑模式,BBEdit 会把汉字的每一行和数字行组合起来。
Alt text
在 BBEdit 中跨行组合文本

识别表格是一个比较偏的场景,短期内大概不会普及。不过,我们可以先用截图 OCR 功能准确按列识别数据,再跑到列编辑模式下将数据组合起来。本例子只涉及两列数据,实际上不限长度。

选择 PDF 局部的文字

列编辑的核心其实是“列选择”,因此不仅在编辑器中可以用,在多数阅读器乃至 Quick Look 里也有用处。比如说,那些双栏或者满是豆腐块的 PDF,平时选择文字时很可能把边上的文字也选中,此时就可以试试在列编辑模式下选择文字,精确选中一个矩形内的文本,不会把附近的无关文字选上。

Alt text
例子四:选择 PDF 局部文字

类似的技巧也能够用于 Quick Look。最近几个版本的 macOS 默认启用 Live Text,可以自动 OCR 识别图中的文字,不过遇上双栏文本或表格时效果就不好,往往会把周边区域的文字识别成同一行;而列编辑也可以解决这个问题,和在 PDF 中一样,按住 ⌥Option 就可以选择一个矩形区域的文字,不用担心 OCR 识别不到位。

小结

列编辑本是代码编辑器的专属功能,常用于批量插入缩进符号等机械操作,而不同编辑器对其支持程度又不一,因此它很少被作为一种通用方法。但毕竟多数编辑器多多少少都有列编辑模式,而且最强大的那一批工具——BBEdit、VSCode 和 Obsidian 等等——通常又是免费的3,因而在事实上,列编辑完全可以作为一项通用技能。

下次在你打算人工操作或者写一段正则表达式之前,不妨先按住 ‌⌥Option,看看列编辑能不能更快地解决问题。说不定就有惊喜。


  1. 难得的例外是输入空格,也就是说,文章开头给 Markdown 列表批量添加空格的操作,在绝大多数编辑器中都可以完成。
  2. 这还是比较乐观的情况,如果两列靠得比较近,多数 OCR 工具还会把两列当成一列。
  3. 据我所知,本来就有很多人用 VSCode 写 Markdown,或者用 BBEdit 写博客,因此无论这些编辑器最初是不是为写代码而设计,它们本身都被当作写作工具在使用了。

author_avatar

Lawyer, macOS/iOS Automation Amateur