emacs的自动补全

前言

长久以来由于使用spacemacs一直为emacs的自动补全头疼,
因为配置backends的方法较为隐秘,
在各种模式下backends会改变,
知道重新看了子龙山人的教程才发现backends也比较简单.

补全方案的机制

company-backends 变量中存储着各种补全的方案.
比如company-mode包默认的配置是

1
2
3
(company-bbdb company-eclim company-semantic company-clang company-xcode company-cmake company-capf company-files
(company-dabbrev-code company-gtags company-etags company-keywords)
company-oddmuse company-dabbrev)

emacs从头到尾匹配,如果匹配则使用该后端并忽略之后的后端.
如果希望匹配到后仍然继续使用之后的backends,则再装进括号,称为group backend.

常见的补全方案

排序方案 作用
company-bbdb 可能和联系人列表有关
company-eclim eclim(eclipse+vim)相关
company-semantic c,c++语法静态解析
company-clang C,c++,c#等一系列语言相关
company-xcode 对xcode的项目有补全作用
company-cmake 对cmake文件有补全作用
company-capf completion-at-point-functions?
company-files 根据文件名进行补全
company-dabbrev-code 根据所有buffer中的代码补全
company-gtags 根据gtags(维护一套关键字进行索引并方便跳转,company获得列表来补全)
company-etags 类似gtags
company-keywords 可能类似dabbrev
company-oddmuse 编辑Oddmuse(一种wiki引擎)wiki文件的补全
company-dabbrev 所有buffer中的内容进行补全,默认不理会scratch中内容

一种排序方法

一般把一些依赖固定模式或语言的补全放在最前方,
若非常重视文件名的补全,也可以将之放在前方.
代码变量名补全等等的放在一个group中,置中.
而buffer内容补全的放在最后.

配置的方法

1
2
3
4
5
6
7
8
9
10
11
12
;; 配置自动补全后端
(setq company-backends
'(company-files
(company-semantic company-dabbrev-code company-gtags company-etags company-keywords)
company-dabbrev))

;; 使用hook配置
(add-hook 'python-mode-hook
(lambda ()
(set (make-local-variable 'company-backends) '((company-anaconda company-dabbrev-code)
company-dabbrev)))
)

备注

虽然在spacemacs中,补全方案的列表会随着列表改变,
(spacemacs还隐式调用了add-hook等方法导致不好配置)
但在自定义的配置中,这些补全方案在各个模式下是不会变的.

参考

  1. 日本人博客中扒了一些后端的含义
  2. 从company-mode官方仓库看注释找后端用途