把 dabbrev-expand 的内容加入 company 补全菜单中

看了一下 company 的源码, 把下面四句加入大家的配置文件中, 就可以让 company 补全 dabbrev-expand 的内容:

(require 'company-dabbrev)
(push 'company-dabbrev company-backends)
(setq company-dabbrev-char-regexp "[\\.0-9a-z-_'/]") ;adjust regexp make `company-dabbrev' search words like `dabbrev-expand'
(setq company-dabbrev-code-other-buffers 'all) ;search completion from all buffers, not just same mode buffers.

最为关键的是后面两句:

(setq company-dabbrev-char-regexp "[\\.0-9a-z-_'/]")
(setq company-dabbrev-code-other-buffers 'all)

company-dabbrev-char-regexp 默认的正则表达式是 \sw , 意味着只能匹配单词才能补全, 我重新定制成 [\.0-9a-z-_'/] , 增加搜寻的范围

company-dabbrev-code-other-buffer 设置成 'all 的意思是像 dabbrev-expand 那样搜索所有 buffer 的内容, 而不仅仅是和当前模式相同的buffer里面去搜索.

最后来一张效果图:

更多参考配置可以查看: EmacsWiki: init-company-mode.el

1 个赞

就是把-之类加入company对word的定义里是吧?我都是

(modify-syntax-entry ?- "w" web-mode-syntax-table)

-在syntax-table里改成word,这样比你的方法更mode specific一点。

缺点是这样emacs/evil的motion会把-当成word。更好的解法是-当做symbol-constituent,company补全symbol而非word。不过我用evil时把word的motion全部alias成symbol了,(defalias #'forward-evil-word #'forward-evil-symbol),所以这个问题没影响到我。


说到company,顺带求看一下这个帖子:

Mark一下~~ 搜关于第二个选项的配置搜到了这里,谢谢楼主分享。