yasnippet 没有工作,大佬帮看看

我以为你说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 个赞

玩腻了。完了几年vim了插件也了几个了。

这就很麻烦,不是很清楚emacs的api,但是这几天配置的过程,代码片段需要和补全comgpany结合配置才能使用,vim只需要接管omi就可以 不管你有没有补全 snippet都可以用。两个东西互不干涉的。在emacs里这2个耦合度太高了。

差不多是这样的。

company-lsp-enable-snippet 这个设置放在init里试试 加点log,补全的时候把backends也打出来,看看实际补全的时候到底生效了没

company-lsp-enable-snippet 这个东西是加载server返回的snippet与yasnippet无关吧?lsp我去年就开始研究了。只不过之前一直用vim。所以这个设置不应该影响yasnippet 2个东西。不管在vim还是emacs。