company-yasnippet 在补全提示中显示不出来

如下,按照 company-yasnippet 文档上配置,未果,没有显示 yasnippet 的提示。

(push '(company-robe :with company-yasnippet) company-backends)

image

如果直接如下设置的话

(push 'company-robe company-backends)
(push 'company-yasnippet company-backends)

这样的话就只能显示自己写的 yasnippet 提示了。

image

我要怎么做才能同时显示这两种提示?

可以参考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 ...)

其实我想要的不是按某个键帮我补全,我只是想让它提示我有多少补全可以用,多的时候记不住啊 :joy:,所以只是想要一个提示的作用,补全本身是没问题的。

那可以试试ivy-yasnippet之类的?

尝试一下,不过还是希望能像 company 这种打着打着就能给提示的

我喜欢这种是因为他把所有可选的直接列出来,这样你忘了还可以找。company的话必须记得至少前几个字母。

company可以从中间搜索的呀 是你的配置不对

最新进展。。。我发现

(push '(company-robe :with company-yasnippet) company-backends)

这样,只有在启动 robe-start 之后,才能用!就是我想要的样子了。
现在研究一下,怎么让它在一般的模式下也能用。所以我需要一个 company-ruby ?但是并没有这个包。

1 个赞

Try this

恩,看明白了。但是我要在 backend 里填什么呢?并没有 company-ruby 啊

现在的yas貌似不用hack了,直接把tab绑到yas-maybe-expand就会智能控制了

yas-next-field-or-maybe-expand?这是yas展开后用的吧?我上面这个是展开前和company合作

我已经去掉了 全局的 company-yasnippet,用起来很是恼人,又爱又恨啊。

我也不用了,主要是都记住snippet了…

找到一个比较折中的办法:http://code.lexarcana.com/posts/make-company-yasnippet-play-nice.html。

个人试用觉得不错。需要的时候主动唤出,不需要的时候就不出现。最好的方式还是像 VS 一样,在需要的地方智能唤出,想了想还不好实现,可能需要改造company本身吧。有思路的可以提提哈,看能不能实现。

我个人感觉,简单snippet手敲然后expand,复杂snippet用ivy或helm,配合posframe做fuzzy search是坠吼的。

这种放在小框框里的snippet补全,不太实用。

你说的这个吧?https://github.com/mkcms/ivy-yasnippet

./demo.gif

company-yasnippet 会出现在成员函数/属性的补全列表中吗?

会。compsny只会用一个后端,所以yas后端是附加到每个后端上的