Emacs: 英文单词(或唐诗宋词/其它词库)补全

写点东西时总有英文单词记不清拼写的时候,尤其是比较长或者拼写有点怪的时候。

在Windows下,可以借助紫光拼音输入法或者谷歌拼音输入法的英文单词输入功能:
(图片来源: 驱动之家

(图片来源: 思齐博客


但在Linux下,我就留意到有没有什么好的选择。不过对我来说,现在大多数文字是在Emacs里面敲,本着“无所不能的操作系统”的称号,来折腾一下Emacs下面的英文单词补全吧。

查了一下EmacsWiki: CategorySpelling,里面只说到有两个扩展有这个能力: SynonymsPredictiveMode。但这两个东西都有一个共同的缺点:相关依赖太多,不够简便(synonyms需要icicle才能提供英文单词补全能力,还需要下载一个20多M的词库;而PredictiveMode需要auto-overlay和completion-ui以及其它一些包)。

Dabbrev闪亮登场

而后我想起了之前看到的dynamic abbreviation补全方式,这是Emacs自带的功能。跟普通abbreviation不同的是,它不需要你预先定义缩略语和展开形式这样的对子(比如abbr -> abbreviation),而是在其它buffer中查找。

也就是说,只要我在Emacs打开 /usr/share/dict/words 就可以用M-x dabbrev-expand或者M-x hippie-expand进行补全英文单词了,如果有多个备选项,你再调用一下就可以选到下一个。这算不算最简单的英文单词补全方法?

(可能有朋友会问那个 /usr/share/dict/words 是什么,哪里来的。这个文件存放的是单词列表,每行一个单词,在Debian上这个文件它可能实际上指向miscfiles包提供的韦伯国际英语单词表(/usr/share/dict/web2),wamerican包提供的美式拼写词汇表(/usr/share/dict/american-english),或者dictionaries-common包提供的一份单词表(不清楚来源和与另外两个的区别)。你想用哪个就打开哪个好了。而且 http://wordlist.sf.net 这个网站还其它一些单词表。)

其实这种方式也可以用来补全其它的内容,比如唐诗、宋词: Debian的fortune-zh包,里面收录了唐诗三百首、宋词一百首,在Emacs中打开 /usr/share/games/fortunes/tang300.u8,就可以用M-x dabbrev-expand来补全唐诗了 :-)


Auto-Complete

不过内置的dabbrev-expand/hippie-expand有一个小缺点: 有多个备选的时候只能一个个轮换,不能一下子看到所有备选项进行挑选,也不能在多个备选项里面再搜索什么的。

而我最喜欢的补全包 auto-complete 就可以解决这个问题(而且它还支持模糊搜索(仅限英文))。它自己支持从其它buffer取内容补全,底层不需要dabbrev。不过基于性能考虑,缺省没有把words-in-same-mode-buffers words-in-all-buffers 这两个补全源配置在ac-sources里面。我也不建议将这两个源加到缺省ac-sources里面去,可用下面的方法:

Auto-Complete包在1.x (?)之后会对每个补全源(source)提供一个独立的命令:ac-complete-xxxx(前提是得用新的ac-define-source来定义源,而不是以前的defvar方式),所以只需要单独调用 ac-complete-words-in-all-buffers 命令就可以了。

(global-set-key (kbd "C-M-/") 'ac-complete-words-in-all-buffers)

(defun ac-expand-english-words ()
  (interactive)
  (find-file-noselect "/usr/share/dict/words")
  (call-interactively 'ac-complete-words-in-all-buffers))

(global-set-key (kbd "C-, w") 'ac-expand-english-words)

 



posted @ 2011-08-20 14:47  巴蛮子  阅读(2020)  评论(6)    收藏  举报