Emacs 拼写检查:如何一次性标记文档中所有拼写错误?
当然可以!在Emacs里实现一次性标记所有拼写错误,同时自动忽略代码段的需求完全没问题,我来给你一步步说明具体做法:
一、一次性查看/标记所有拼写错误
Emacs自带的拼写检查工具里,有两个实用的命令可以帮你全局定位所有拼写错误:
flyspell-list:直接执行这个命令,Emacs会打开一个新的缓冲区,把当前文档里所有的拼写错误列出来,每条错误都包含错误单词、所在行号和上下文。你可以直接在这个列表里点击错误条目跳转到对应位置,还能批量处理(比如统一替换某个错误单词、添加到个人词典等)。ispell-buffer:这个命令会扫描整个缓冲区,逐个提示拼写错误,同时也会在缓冲区里实时标记出错误位置。不过相比flyspell-list,它更偏向交互式逐个处理,但也能让你全局了解所有错误分布。
如果你的文档已经开启了flyspell-mode(实时拼写检查),其实默认就会给所有拼写错误加上波浪线标记,flyspell-list相当于把这些标记整理成了可操作的列表,用起来更高效。
二、配置忽略代码段
要让拼写检查自动跳过代码区域,我们可以通过设置ispell-skip-region-alist来定义需要排除的区块规则,针对不同的文件模式(比如Markdown、Org、LaTeX等)做针对性配置:
示例1:Markdown模式下跳过```代码块
在你的Emacs配置里添加这段代码:
(add-hook 'markdown-mode-hook (lambda () (setq ispell-skip-region-alist '(("^```" . "^```")))))
这段配置会让拼写检查忽略所有以^```开头到^```结尾的代码块区域。
示例2:Org模式下跳过代码块和示例区块
如果是用Org-mode写文档,你可以这样配置:
(add-hook 'org-mode-hook (lambda () (setq ispell-skip-region-alist '(("^#\\+BEGIN_SRC" . "^#\\+END_SRC") ("^#\\+BEGIN_EXAMPLE" . "^#\\+END_EXAMPLE")))))
它会自动跳过Org里的#+BEGIN_SRC到#+END_SRC代码块,以及示例区块。
通用规则
你可以根据自己常用的文件模式,按照(起始正则表达式 . 结束正则表达式)的格式,添加到ispell-skip-region-alist里,实现对任意代码/特殊区块的忽略。
三、额外优化:自定义错误标记样式
如果你觉得默认的波浪线不够明显,可以自定义flyspell-incorrect这个face的样式,比如改成红色粗波浪线:
(set-face-attribute 'flyspell-incorrect nil :underline '(:color "red" :style wave :weight bold))
这样配置好之后,你打开文档时,拼写检查会自动跳过代码段,同时用flyspell-list就能一次性查看所有拼写错误,完全满足你的需求啦!
内容的提问来源于stack exchange,提问作者Ralf




