yasnippet 没有工作,大佬帮看看

有设置 t,没工作。。

向company-lsp报bug吧 :joy:

问题描述不对,是 company 中想集成 snippet 功能吧?

company-yasnippet

Documentation company-mode backend for yasnippet.

This backend should be used with care, because as long as there are snippets defined for the current major mode, this backend will always shadow backends that come after it. Recommended usages:

  • In a buffer-local value of company-backends, grouped with a backend or several that provide actual text completions.

    (add-hook 'js-mode-hook (lambda () (set (make-local-variable 'company-backends) '((company-dabbrev-code company-yasnippet)))))

  • After keyword :with, grouped with other backends.

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

  • Not in company-backends, just bound to a key.

    (global-set-key (kbd “C-c y”) 'company-yasnippet)

嗯 应该是吧。在vim里我配置是可以做到这样的 输入meth 会有补全。我选中就展开snippet了,emacs里是集成到company里吧?放到company-backend对吧? git

不知道是哪儿的问题啊。我在下面贴了个图 我在vim里是这么用的,怎么在emacs实现差不多的效果

我以为你说lsp的snippet展开失灵了呢。。。

原来是company配合yasnippet啊,给想要的后端加上:with company-yasnippet就行了。比如和company-lsp配合

(with-eval-after-load 'lsp-mode
  (push '(company-lsp :with company-yasnippet) company-backends))

注意禁用lsp-auto-configure

1 个赞

放到company的:config 下面了 没起作用 是要放到哪里呢。我lsp的配置和company是2个文件

首先,最小化运行(运行emacs -q)后,执行:自己添加一点package.el与 use-package 相关的代码和你给的代码,最后手动运行 yas-global-mode 和 company-mode 代码。发现company可以提示关于yasnippet的选项。 附添加的代码

(setq package-archives '(("gnu"   . "http://elpa.emacs-china.org/gnu/")
                         ("melpa" . "http://elpa.emacs-china.org/melpa/")))

(require 'package)

(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))
(package-initialize)
(eval-and-compile
    (setq use-package-always-ensure t)
    (setq use-package-always-defer t)
    (setq use-package-expand-minimally t)
    (setq use-package-enable-imenu-support t))

(require 'use-package)
;; 之后加上你的代码

PS: 你可以看看 use-package 中关键字 :preface , :init , :config(代码执行的先后顺序)和 :defer , :demand(是否延时执行代码)的介绍 use-package-keywords

那就奇怪了 我一点得不到。是和我vim里的效果一样吗 我输入for 就有补全菜单显示snippet 然后确认选中展开?

对,这是在rust-mode中的 2019-07-31-181735_1366x768_scrot

我只能这样操作才有snippet git

在 github上有关这件事的讨论https://github.com/tigersoldier/company-lsp/issues/119

这说明yas设置没问题,下一步是m-x company-yas,这是检查com yas的设置,按照company的逻辑,有些设置下,前边的backend找到了,就不会再找备用的,具体参考com的说明

你那个with,如果我没记错,就是设置备用,或者是排到最后

你要往下拖呀,yas提供的补全没在下边?

拉到底也没有for的snippet

嗯 看了下 好像是这个问题

代码片段这块和vim比弱了。。

如果vim用的挺好 为什么还要用emacs呢

这其实是个company对yasnippet的补全支持问题,和yasnippet本身倒关系不大。

之所以支持很基本,没有你截图中vim那么炫酷,主要还是使用群体的问题,我猜。估计和我类似,因为yasnippet比company出现早,很多人是不用company作yansippet key的补全的,因为如果常用的major mode下snippets太多了,会搞得补全列表很乱,而且早习惯了基本不用key补全(偶尔忘了也可以点菜单栏查下,最多多个重名key用complete-symbol在minibuffer里选选),于是开发者也不花时间搞好它了。所以补全的界面支持的确没有snippet移植到vim上那么好,而且emacs得自己整合,并不是默认的(好像complete-symbol对重名key是默认支持的(不重名直接tab补全snippet内容了),而auto-complete或company都得自己另设)。

不知道是不是想要这样的效果:

company

配置:


    (yc/defmacro yc/add-company-backends-with-yasnippet (&rest backends)
      `(set (make-local-variable 'company-backends)
            (push ',(append backends '(company-yasnippet :separate)) company-backends)))
    
    (use-package lsp-mode
      :custom
      (lsp-enable-indentation nil)
      (lsp-auto-configure nil)))
    
    (defun yc/lsp-adv (&rest args)
      "Advice for 'lsp': update company backends, and enable flyckcheck."
    
      ;; functions to run after lsp...
      (lsp-ui-flycheck-enable t)
      (yc/add-company-backends-with-yasnippet company-lsp)
      (flycheck-mode 1))
    
    (advice-add 'lsp :after #'yc/lsp-adv)

这是 lsp 启用后, company-backends的值:

((company-lsp company-yasnippet :separate) (company-keywords company-dabbrev-code company-yasnippet :separate) (company-files company-dabbrev company-abbrev :with company-yasnippet))

1 个赞