“复制粘贴”似乎成了偷懒的代名词。事实上,复制内容并不是简单的事情:PDF 常常夹杂多余空格,中文网页莫名其妙掺着英文符号,或者摊上一个滥用标点的同事(例如将接下来的省略号打成六个英文句号)……清理这些文字错误,其实给复制粘贴徒增了很多劳动量。
与其说复制粘贴是偷工减料,不如说清理不善的复制粘贴才显得粗制滥造。读书时,导师就调侃我们的论文“空格都不删干净,一看就知道是抄的”(复制中文 PDF 时,每行结尾都会带一个空格)——实际上,只要控制好量,直接引用完全是正当的,真正给人“抄袭”感的,其实是未经清理的文本。
和搞卫生一样,清理文本也不能全指望手动操作,一处一处改过去效率太低,还容易挂一漏万;比较上心的人会使用查找替换(Find & Replace)功能,批量替换当前文档中的文本错误。可惜,多数查找替换功能都分布在两个极端,要么过于基础,只能把一个写死的词换成另一个固定的词,处理不了多余空格、换行符等特殊情况,macOS 自带文本编辑器以及绝大多数 Markdown 编辑器就属此列;要么就要依靠 Word 这样的重量级编辑器,并且往往需要掌握偏门、晦涩的文本替换语法。
本文基于 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 原生模块。作为一个附带的好处,代码也容易移植到其他自动化工具中。
