# 工具论ABC：普通用户也用得上的列编辑

> 本文公开全文。

原文：https://utgd.net/article/20485

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

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

## 什么是列编辑

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

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

- 普通模式下，选择文本是逐行进行；

- 列编辑中，则是按住 ‌⌥Option 键，然后用光标拉出一个矩形选框，选中框内的文本。

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

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

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

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

## 不同编辑器中的列编辑

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

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

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

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

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

## 快速复制图片中的表格

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

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

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

- 复制汉字部分，确保汉字部分的行数和数字部分一样；

- 按住 ‌⌥Option 键，选中数字部分每一行的开头或结尾；

- 按下 ‌⌘Command\-V 粘贴汉字部分，因为当前是列编辑模式，BBEdit 会把汉字的每一行和数字行组合起来。

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

## 选择 PDF 局部的文字

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

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

## 小结

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

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

---

[前往标准阅读页](https://utgd.net/article/20485?audience=web)
