# 用 Keyboard Maestro 打造文字格式清理工具箱

> 本文公开全文。

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

“复制粘贴”似乎成了偷懒的代名词。事实上，复制内容并不是简单的事情：PDF 常常夹杂多余空格，中文网页莫名其妙掺着英文符号，或者摊上一个滥用标点的同事（例如将接下来的省略号打成六个英文句号）……清理这些文字错误，其实给复制粘贴徒增了很多劳动量。

与其说复制粘贴是偷工减料，不如说清理不善的复制粘贴才显得粗制滥造。读书时，导师就调侃我们的论文“空格都不删干净，一看就知道是抄的”（复制中文 PDF 时，每行结尾都会带一个空格）——实际上，只要控制好量，直接引用完全是正当的，真正给人“抄袭”感的，其实是未经清理的文本。

和搞卫生一样，清理文本也不能全指望手动操作，一处一处改过去效率太低，还容易挂一漏万；比较上心的人会使用查找替换（Find & Replace）功能，批量替换当前文档中的文本错误。可惜，多数查找替换功能都分布在两个极端，要么过于基础，只能把一个写死的词换成另一个固定的词，处理不了多余空格、换行符等特殊情况，macOS 自带文本编辑器以及绝大多数 Markdown 编辑器就属此列；要么就要依靠 Word 这样的重量级编辑器，并且往往需要掌握偏门、晦涩的文本替换语法。

本文基于 Keyboard Maestro 打造了一套跨应用文本清理工具，诸君在继续使用自己现有编辑器的同时，能够修复常见的文本错误，例如中英文标点、空格、空行、换行符和同形字的滥用与误用（根据我的习惯，第一和最后一项功能合并在同一个 Keyboard Maestro 动作中，你可以拆开）。

Keyboard Maestro 动作下载

## 动作使用

文本格式错误千奇百怪，没有什么万金油，必须针对每种具体情况使用对应的工具。仅仅本文提供的默认动作就有 3 个，因此我没有采用传统思路、设置一堆快捷键，而是借用了 Keyboard Maestro 的 Palette 特性，通过 ‌⌃Control\-⌥Option\-⌘Command\-T 一键呼出汇集所有文本情况功能的“悬浮工具栏”，再从中选择所需功能。熟悉全键盘操作的读者可以根据动作名首字母，通过字母或数字键选取动作，而更偏爱鼠标或触控板的读者也可以直接点选。如果对 Palette 功能有所好奇，可以阅读《Keyboard Maestro Palette：macOS 上的全能工具箱》一文。

每个动作都术业有专攻，从 PDF 或网页复制一段文本后，运行其中一个格式清理工具，即可将清理后的文本粘贴到当前编辑器中。具体的清理功能包括：

- 标点替换，将常见的英文标点换回中文标点，比如 ?、\! 换回 ？ 和 ！，适合清理一些混用标点符号的网页内容，比如网页翻译；

- 删除重复空格，常见于清理中 PDF 中复制出来的文本；

- 删除重复空行，如果你遇上一个狂敲回车排版换页的人，那这个动作可以帮你节省大把时间（可能兼有降低血压的功效）；

- 替换同形字，模板动作是将 民 换回 ⺠，如果你在浏览器中看不出这两个字的外形差异，那恰恰说明你的电脑环境难以区分这些雷同的文字，有必要通过自动化工具更修复正这些看似一样的文字（我通常同时需要处理标点和同形字，所以将第一个功能放在用一个动作中，机制也都是 Javascript 中的文本替换）。

当然，仅凭本文提供的几个模板动作不可能穷尽所有的文本格式问题，何况所谓的“格式问题”也是因人而异，例如在直角引号拥趸那里弯引号当属异端，而在坚持国标的人看来这种用法与错别字无异（如果有人坚持在论文中使用 「」，那他就是在那自己的学士帽开玩笑），所处立场不同，眼中“正确”的文本格式也有差异。与其在这里像传教一样宣扬某种用法，不如探讨一下 Keyboard Maestro 的文本替换原理，以便诸位各取所需。

## 原理简析

正如文章开头所说，使用 Keyboard Maestro 这种自动化工具，是为了摆脱编辑器的束缚，可以在任意应用（不止编辑器）中清理文本格式；另一方面，编辑器自带的查找替换功能每次都要重写填写替换前后的文本（极少数带有历史记录功能，比如 BBEdit），本身就很费力。

整个文本格式清理的思路，其实就是把编辑器中的查找替换功能抽出来交给自动化工具，预先写好替换前后的参数，使用时尽可能达成“一键清理”的效果。能够进行文本替换的自动化工具其实还有 TextSoap 和 TextExpander，我之前也基于 TextExpander 写过一些文章，但要么就是大小写互换、首字母大写那一套，用在中文环境中实在不痛不痒，要么就是得手写代码，最终我还是被图形化的 Keyboard Maestro 俘获。

### Keyboard Maestro 查找替换模块简介

Keyboard Maestro 的查找替换步骤即“Search and Replace …”，查找的对象可以是剪贴板，也可以是一个现成的文档，就本文所追求的跨应用场景而言，自然是选择剪贴板；查找替换的模式也有多种，除了简单地将一段文本换成另一段固定文本（String），还可以使用正则表达式（Regular Expression）做一些灵活的替换，随后删除重复空格和换行符就需要用到这一查找替换模式。总之，只要你用过任何编辑器的查找替换功能，就可以很快上手 Keyboard Maestro 的查找替换模步骤，无非是可以调整的参数更丰富一些。

本节以替换常见英文标点为中文标点为例——注意，这不是你下载的，因为只用自带模块的话，Keyboard Maestro 动作会变得极为冗长——展示一下 Keyboard Maestro 查找替换步骤的基础用法。滥用标点或者标点编码错误很常见，有时候即便原文作者很仔细，一经网页打印，可能就会出现“看着是中文标点，其实是英文标点”的情况，问号、叹号和括号都是重灾区。日常交流时这种错误可以一笑了之，但在正式文件中就显得非常业余。

下图的 Keyboard Maestro 步骤展示了一串连续的查找替换步骤，分别负责将英文问号、感叹号、句号、逗号和括号等符号换成中文下的对应符号（显示器高度有限，故将后几个查找替换步骤折叠起来），所有替换操作结束后再通过“Insert Text …”步骤将清理好的文本贴在当前编辑器中。

上图中一连串的查找替换操作将按部就班地进行替换，每次替换完毕都会把结果放回剪贴板，如果没有需要替换的内容则不会发生任何事情，不耽误动作运行。最后一步中的 %SystemClipboard% 表示获取剪贴板内容，该步骤将代替“粘贴”操作，缺少这一步不影响整体功能，只是需要手动粘贴。

正如上面例子所展示的，Keyboard Maestro 的步骤就像搭积木一样方便（用过 Shortcuts 的读者会更有体会，两者都是用一些图形化模块搭建自动化动作），也许很粗糙，但是能奏效。通常而言，中文不涉及大小写问题，无论使用普通字词替换还是正则表达式，都建议选择“ignoring case”即忽略大小写。

根据面对的具体场景，还可以这里抽出一块、那里叠上一块，搭建出专门的清理工具。比如，我下载的《中华人民共和国刑法》大概编码有问题，所有的 严重 都成了 严口，于是我就加了一个把 严口 替换回 严重 的步骤；又如，我曾经遇到一份通篇用空格和回车排版的 Word 文章，无奈之下只好将删除重复空格和重复空行的动作拼在一起使用（即将文本替换步骤放在一个动作里）……水来土掩，灵活对付。

### 清理多余空格、空行和换行符

正则表达式是 Keyboard Maestro 查找替换功能的重头戏，可以根据“模式”来替换文本，比如将“任意多个空格”缩减为“一个空格”，比直接更换字词更为灵活。多数编辑器——包括 macOS 原生文本编辑器、Ulysses 等 Markdown 写作工具和 Pages——都不支持，即便是 Word 也仅涉及能实现部分功能，而且需要学习其专有语法。

诚然，正则表达式本身有一定的学习门槛，不过本文也不是编程教学，所以直接分享一些常见案例，不会像教科书那样讲解正则表达式的语法。最简单一个例子就是替换重复文本，比如多余的空格，常用于删除中文 PDF 换行时夹杂的空格符号。

在正则表达式中，空格需要用 \\s 表示，而“重复”则需要随后加上 \+，意为一个及以上。不熟悉正则表达式的读者可以权当这是一场文字游戏。在查找替换模块中切换到“Regular Expression”模式后，就可以使用 \\s\+ 这一正则表达式，用于清除 PDF 中常见的多余空格。替换后的文本可以根据场景做调整，中文不需要掺空格，可以不填替换后的文本、直接删掉所有空格，而英文可以填一个 \\s，表示将重复空格删减到一个。下图演示的是删除中文 PDF 换行时出现的多余空格。

除了空格，正则表达式也可以匹配其他的“模式”，比如重复的空行。空行需要用 \\n 表示，重复空行则是 \\n\+，与重复空格的正则表达式如出一辙，均为“某些文本\+出现次数”的模式：

- 空格是 \\s，重复是 \+，重复空格是 \\s\+

- 空行是 \\s，重复是 \+，重复空行是 \\s\+

有时候 OCR（Optical character recognition，光学字符识别）出来的文本会夹杂多余的符号，比如 \.、·、• 和 … 等各种“点”，雪上加霜的是它们数量还很随机，这时候不妨试试用正则表达式将其清除。

正则表达式的拓展空间并不止步于此。我曾经做过一个 法律条文一键排版工具，可以把网上复制下来的条文改为整齐的 Markdown 文件（下图以百度百科为例只为增强排版前后对比效果，找法律文件应当去国家机关的官网）。像这种高度定制化的格式调整工作流固然缺乏通用性，但恰恰说明了 Keyboard Maestro 极具潜力，稍作修改就能适应非常个人化的场景。

### 修复肉眼不可见的错字（同形字）

PDF 文字编码问题层出不穷，年年岁岁出问题，岁岁年年错不同，近几个版本的 macOS 中比较惹眼的是中文字符“所见非所得”现象：明明复制了 重重叠叠，一粘贴却成了 口口口口；更严重的是 民 和 ⺠ 滥用，在大多数系统的默认字体中看上去毫无差别（你的浏览器大概率也如此），但实际上它们是两个字，编码完全不同。

诸如多出几个空格、空行之类的问题还比较容易发现，数量不多的话手动删改一下也不算吃力，但中文所见非所得就防不胜防，“民”和“⺠”这种肉眼几乎无法察觉的错字更是阴损，不特意检查汉字编码就基本查不出来。这类文字错误，就适合用 Keyboard Maestro 自动更正。这个问题虽然刁钻，但是解决起来和替换一段固定文本并无任何区别，可以直接使用“Keyboard Maestro 查找替换模块简介”一小节中介绍的、最简单的查找替换功能。

当然，民\-⺠ 暂且不论，口 毕竟是一个常见字，不分青红皂白地将其替换成 重 难免殃及池鱼，更妥当的做法是将包含错字的词组整个替换，比如把 严口 换回 严重，前者显然不是一个词语（除非当作人名），大概率是编码出错的结果。归根结底，修复这类 PDF 文字错乱需要随机应变，完全可以临时做一个查找替换动作，用完再将其删除或禁用，只要能降低操作负担，“一次性”的自动化又何尝不是自动化。

下面是我发现的部分 PDF 中文编码问题，每行左侧为想要复制的文字，右侧为编码出错后的字符，有需要的读者可以自行填入 Keyboard Maestro 查找替换步骤。

```
民-⺠
口-又
重-口
叠-口
宝-兀
```

不难料见，上述清单不过是冰山一角，虽然可以不断累加替换模块，但恐怕会变得过长，因此我提供的动作也包括了更短小的 Javascript 版本，你可以把替换前后的文本写进 Javascript 代码，而非半图形化的 Keyboard Maestro 原生模块。作为一个附带的好处，代码也容易移植到其他自动化工具中。

---

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