我以为你说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
我以为你说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
放到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中的
我只能这样操作才有snippet
这说明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都得自己另设)。
不知道是不是想要这样的效果:
配置:
(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))
玩腻了。完了几年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。