Spacemacs 更新:设置 `company-backends`

刚刚试了 Spacemacs develop 分支,启动发现报错

(void-function spacemacs|defvar-company-backends)

找了找发现这个 macro 不见了。

去 github 上翻了翻发现了原因。

主要是有人觉得需要在每个 config.el 里面定义 company backends 太麻烦,就把这两个取消了。

新的用法是:

 (defun org/post-init-company ()
 -  (spacemacs|add-company-hook org-mode)
 -  (push 'company-capf company-backends-org-mode))
 +  (spacemacs|add-company-backends :backends company-capf :modes org-mode))
  
  (defun org/post-init-company-emoji ()
 -  (push 'company-emoji company-backends-org-mode))
 +  (spacemacs|add-company-backends :backends company-emoji :modes org-mode))

给大家踩个坑。

一直在用 develop 分支的路过

不敢随便更新。怕踩坑。

这次我用上了develop是因为手贱试了develop以后切回去反而有bug。所以干脆用上了develop branch

我已经踩习惯了,已经到了有些bug只有不影响使用就不管它的地步

感谢,我注释掉了 config.el 里的那几句。但是发现 packages.el 里的 add-company-hook 成了 void function。。楼主你这边没报错么,我的版本是最新的 0.300.0 昨天刚更新 :sweat_smile:

有段时间没用 Spacemacs 啦。。。现在用自己的配置了。

踩雷敢死队。。。。。。

这里设置company-backends的方法是需要修改相应layer的package.el吗?但是这样做的话,如果更新spacemacs岂不是做过的修改就都消失了?能直接把修改添加在.spacemacs文件中吗?

老早以前的事了,而且只有自己写 layer 的从 master 切到 develop 才要改。正常来说你完全不需要改 Spacemacs 自带的东西,修改消失也无从谈起。

那我要是想在latex这个layer中添加company-reftex-labels这个backend,是直接把相应的latex/init-company-reftex函数写在.spacemacs里,还是说我直接在.spacemacs里面添加(add-to-list 'company-backends ‘company-reftex-labels)就可以?但是感觉spacemacs是把latex相关的补全后端储存在一个company-backends-LaTeX-mode变量里。

那就用 company-backends-LaTeX-mode

我直接在user/config里面直接用add-to-list修改company-backends-LaTeX-mode的值,发现并没有作用,这个变量的值没有任何变化。

`spacemacs|add-company-backends’

文档里说spacemacs|add-company-backends这个函数只能用在init-company-xxx这种函数中,我就直接把加在package.el中的配置抄到user/config中了,并没有任何作用,是哪里用错了吗?

  (defun latex/init-company-reftex ()
        (use-package company-reftex
          :defer t
          :init (spacemacs|add-company-backends
                  :backends
                  company-reftex-labels
                  company-reftex-citations
                  :modes LaTeX-mode)))
  (add-hook 'Tex-mode-hook 'latex/init-company-reftex)

初始函数不是这么用的,你可以直接修改 latex layer 的 package.el 文件,或者把它放到你的 private layer 里,最后那个钩子没有必要。比如放到名为 my-latex 的私有 layer 中:

  (defun my-latex/init-company-reftex ()
        (use-package company-reftex
          :defer t
          :init (spacemacs|add-company-backends
                  :backends
                  company-reftex-labels
                  company-reftex-citations
                  :modes LaTeX-mode)))

1 个赞

我也觉得这样不对,但是修改latex layer中的文件,更新spacemacs话就会被覆盖掉,而用private layer对我这种新手有点头疼啊。

private layer 非常简单,你用下面的命令生成一个模板,然后填空。最简单的情况,就把上面这个函数填进去就好了。

image

这次的确是可以了,谢谢!

写在自己layer里能解决的,放在user-config里肯定也可以啊,自己加layer不过是另一种组织方式……在layer的文件里的my/init-some-packagespacemacs会去调用,放在user-config里就是defun了之后没人去调它。

user-config里直接(use-package ...)应该和楼上et的做法是一样的效果。

的确这样做也可以