Emacs中的拼写检查
首先说一下aspell。根据其官方网站的说法,它是一个自由、开源的拼写检查工具,最终是要用来替代以前的ispell命令。相较于ispell,aspell具有如下的优势:
-
能够直接检查UTF8编码的文档而无需专门的词典。
-
可以同时使用多个词典。
-
当有多个aspell进程时,能够智能地分别处理相应的用户自定义词典。
由于apsell被Emacs ispell调用(当然,Emacs ispell也可以被设置为调用其他拼写检查工具,如ispell),所以需要事先配置好aspell的默认语言。例如,我需要对英文做拼写检查,就在~/.aspell.conf
文件中加入下面一行即可:
lang en
aspell工作时会用到两类词典:
-
标准词典:它们需要通过
apt
命令安装诸如aspell-en、aspell-de、aspell-fr这样的包。已经在系统中安装的标准词典可以通过如下命令列出:$ aspell dicts
en
en-variant_0
en-variant_1
en-variant_2
en-w_accents
en-wo_accents
... -
用户自定义词典:它们是诸如
~/.aspell.LANG.pws
这样的文本文件。如果默认语言设置为英文,则该文件为~/.aspell.en.pws
。
接下来,需要在Emacs的启动配置文件~/.emacs
中指定Emacs ispell需要调用的外部拼写检查器为aspell:
(setq-default ispell-program-name "aspell")
然后,就可以使用Emacs ispell提供的如下功能,对Emacs中的当前光标处、缓冲区、区域进行单词拼写检查和错误单词的更改了:
-
M-$
:
弹出临时缓冲区,显示光标当前所在位置处错误单词的备选修改列表。如下图所示: -
M-TAB, C-M-i
:执行ispell-complete-word
命令,对光标当前所在位置处的单词进行补全。 -
M-x ispell-buffer
:对当前缓冲区进行拼写检查。 -
M-x ispell-region
:对当前活跃区域进行拼写检查。 -
M-x ispell-change-dictionary <RET> DICT <RET>
:重新启动后台的aspell进程,将拼写检查词典设为指定的DICT。
有了Emacs ispell提供的基本功能后,flyspell minor mode进一步提供了即时拼写检查功能。这包括:
-
M-x flyspell-mode
:打开即时拼写检查功能。随后,错误输入的单词会被高亮。如下图所示: -
M-x flyspell-prog-mode
:在编程环境下,我们只需要对注释段和字符串进行拼写检查。这对于撰写高质量的注释和文档非常有用。将flyspell-prog-mode
函数添加到相应编程环境的mode hook中,则可以激活该功能。例如,(add-hook 'c++-mode-hook (lambda () (flyspell-prog-mode)))
-
在拼错的单词上点击鼠标中键,则会调用
flyspell-correct-word
函数,弹出正确的单词列表菜单以供选择。如下图所示: -
C-.
:执行flyspell-auto-correct-word
函数,自动修改光标处的单词。 -
C-,
:令光标跳至下一个错误单词。
对于以上介绍的Emacs ispell、flyspell,Emacs定义了一系列变量用于指定需要使用的词典,具体如下:
-
标准词典配置
-
ispell-local-dictionary
:其默认值为nil
。该变量的值被前面讲到的ispell-change-dictionary
交互命令改写,只对当前的缓冲区有效。所以,它用于设置临时性的拼写检查词典。 -
ispell-dictionary
:这是Emacs ispell对于aspell命令所用标准词典的全局设置,亦即默认的拼写检查词典。 -
flyspell-default-dictionary
:该变量用于指定使用flyspell minor mode时的aspell标准词典,其默认值为nil
。 -
当以上变量均为
nil
时,则使用拼写检查器aspell自己默认的标准词典。
-
-
用户自定义词典配置
-
ispell-personal-dictionary
:用于指定用户自定义的词典文件,默认值为nil
。 -
当
ispell-personal-dictionary
为nil
时,使用aspell默认的用户自定义词典,即~/.aspell.LANG.pws
。
-
-
单词补全词典配置
-
ispell-complete-word-dict
:用于指定单词自动补全时所用的词典,默认值为nil
。 -
ispell-alternate-dictionary
:当ispell-complete-word-dict
为nil
时,该变量的值用于指定单词补全词典。其默认值为/usr/share/dict/words
。
-
-
现有词典列表
-
ispell-local-dictionary-alist
:该变量存储了一组本地或自定义词典的信息。默认值为nil
。 -
ispell-dictionary-alist
: 该变量存储了一组系统已安装的aspell标准词典信息,一般为非空。
-
由于Emacs的拼写检查功能是通过多工具配合、逐层开发出来的,所以上述介绍的词典配置变量是层级搜索式的,非常繁琐。但在实际使用的时候,如果我们只对一种常用的语言(如英语)做拼写检查并大体上使用系统默认设置,那么就只需要在~/.emacs
中设定ispell-dictionary
的值就足够了。例如,
(setq ispell-dictionary "en")
至此,本文关于Emacs中拼写检查功能的配置与使用已经介绍完了。感兴趣的读者不妨在自己的电脑上体验一下在Emacs中用标准、正确的英文抒写自己思想的感觉。