在 Emacs 中用正则表达式多点替换

最近在使用 Emacs 的 org-mode 过程中,发现有些格式的 org-agenda-schedule 的条目,诸如带有 SCHEDULED: <2023-12-29 Fri -2d ++1m>DEADLINE: <2023-12-29 Fri -2d ++1m> 的条目并没有实现自己的目的。普通的条目 SCHEDULED: <2023-12-29 Fri ++1m> 可以在 2023/12/29 开始的每一个月在 org-agenda 中生成一个条目以进行日程提醒,添加 -2d 的目的是“提前两天”进行提示。

但是实际上并没有产生自己想要的结果,并且往往是在 2023/12/29 的后两天在 org-agenda 中出现一条过期两天的提醒条目。于是决定将之前标记的所有带有 SCHEDULED: <2023-12-29 Fri -2d ++1m>DEADLINE: <2023-12-29 Fri -2d ++1m> 的条目全部修改为 SCHEDULED: <2023-12-29 Fri ++1m>DEADLINE: <2023-12-29 Fri ++1m> ,也就是将条目的 -[0-9]*[hdwmy]{1} 字段全都去掉。

首先用正则搜索 \(DEADLINE\|SCHEDULED\): <.* \(\+\|\.\)\++ 选出所有的候选条目,随后进入 occur 模式,继续使用 \(\(SCHEDULED\|DEADLINE\): <.*? \)\-[0-9]*[a-z]\{1\} \(\(\+\|\.\)\{2\}.*>\) → \1\3 结合 replace-regexp 函数对目标字符串进行替换。之所以先搜索一次,再使用 occur 模式进行下一次的正则搜索,是因为若直接一次性替换完成,不容易判别替换效果,所以用两次正则匹配或替换完成。

搜索候选条目

进入 occur 模式

进入替换界面

变换结果

正则表达式,其实就是搜索规则,在实际的工作中,这种类似的正则操作在代码重构的场景中非常有用。另外一个最大的感受是, ChatGPT 已经逐渐在工作和生活中扮演越来越重要的角色。