我只偶尔手动用company-yas,平时是按tab看光标前的单词是snippet就展开,否则调用company(取自下面的stackoverflow链接,我修正了两个已经不存在的函数名,同时因为在yas展开时用ret到下一field,去掉了这里的一个函数):
;; https://emacs.stackexchange.com/a/7925/12854
(defun check-expansion ()
(save-excursion
(if (looking-at "\\_>") t
(backward-char 1)
(if (looking-at "\\.") t
(backward-char 1)
(if (looking-at "->") t nil)))))
(defun do-yas-expand ()
(let ((yas-fallback-behavior 'return-nil))
(yas-expand)))
(defun tab-indent-or-complete ()
(interactive)
(cond
((minibufferp)
(minibuffer-complete))
(t
;; (indent-for-tab-command)
(if (and (or (not yas-minor-mode)
(null (do-yas-expand)))
(check-expansion))
(progn
(company-manual-begin)
(if (null company-candidates)
(progn
(company-abort)
(hippie-expand nil)
;; (indent-for-tab-command)
)))
))))
;; (defun tab-complete-or-next-field ()
;; (interactive)
;; (if (or (not yas-minor-mode)
;; (null (do-yas-expand)))
;; (if company-candidates
;; (company-complete-selection)
;; (if (check-expansion)
;; (progn
;; (company-manual-begin)
;; (if (null company-candidates)
;; (progn
;; (company-abort)
;; (yas-next-field))))
;; (yas-next-field)))))
(defun expand-snippet-or-complete-selection ()
(interactive)
(if (or (not yas-minor-mode)
(null (do-yas-expand))
(company-abort))
(company-complete-selection)))
(defun abort-company-or-yas ()
(interactive)
(if (null company-candidates)
(yas-abort-snippet)
(company-abort)))
(define-key evil-insert-state-map [tab] 'tab-indent-or-complete)
(define-key evil-insert-state-map (kbd "TAB") 'tab-indent-or-complete)
(define-key company-active-map [tab] 'expand-snippet-or-complete-selection)
(define-key company-active-map (kbd "TAB") 'expand-snippet-or-complete-selection)
company-backends
是从前到后依次尝试的,如果有任何一个/组有结果,后面的就不会被使用。在两个backend都有结果时要两个一起显示,就合成一组'((company-robe company-yasnippet) company-dabbrev ...)