如下,按照 company-yasnippet 文档上配置,未果,没有显示 yasnippet 的提示。
(push '(company-robe :with company-yasnippet) company-backends)
如果直接如下设置的话
(push 'company-robe company-backends)
(push 'company-yasnippet company-backends)
这样的话就只能显示自己写的 yasnippet 提示了。
我要怎么做才能同时显示这两种提示?
可以参考spacemacs的做法,等我我回家找一下代码
我只偶尔手动用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 ...)
其实我想要的不是按某个键帮我补全,我只是想让它提示我有多少补全可以用,多的时候记不住啊 ,所以只是想要一个提示的作用,补全本身是没问题的。
尝试一下,不过还是希望能像 company 这种打着打着就能给提示的
我喜欢这种是因为他把所有可选的直接列出来,这样你忘了还可以找。company的话必须记得至少前几个字母。
最新进展。。。我发现
(push '(company-robe :with company-yasnippet) company-backends)
这样,只有在启动 robe-start
之后,才能用!就是我想要的样子了。
现在研究一下,怎么让它在一般的模式下也能用。所以我需要一个 company-ruby
?但是并没有这个包。
1 个赞
恩,看明白了。但是我要在 backend 里填什么呢?并没有 company-ruby 啊
cireu
12
现在的yas貌似不用hack了,直接把tab绑到yas-maybe-expand
就会智能控制了
yas-next-field-or-maybe-expand
?这是yas展开后用的吧?我上面这个是展开前和company合作
我已经去掉了 全局的 company-yasnippet,用起来很是恼人,又爱又恨啊。
找到一个比较折中的办法:http://code.lexarcana.com/posts/make-company-yasnippet-play-nice.html。
个人试用觉得不错。需要的时候主动唤出,不需要的时候就不出现。最好的方式还是像 VS 一样,在需要的地方智能唤出,想了想还不好实现,可能需要改造company
本身吧。有思路的可以提提哈,看能不能实现。
cireu
17
我个人感觉,简单snippet手敲然后expand,复杂snippet用ivy或helm,配合posframe做fuzzy search是坠吼的。
这种放在小框框里的snippet补全,不太实用。
company-yasnippet 会出现在成员函数/属性的补全列表中吗?
会。compsny只会用一个后端,所以yas后端是附加到每个后端上的