可否根据不同的语言mode制定不同的company-backends?

问题描述:由于company-capf的返回结果会占用其他后端的返回结果,对于不同任务的需求是不同的?能够通过指定不同backends给对应的mode呢?

(use-package company
  :ensure t
  :init
  (add-hook 'after-init-hook 'global-company-mode
	    'python-mode-hook '(lambda () (setq company-backends '((company-ispell))
					   )))
  :config
  (setq company-minimum-prefix-length 1
	company-idle-delay 0
	company-show-numbers t)
  )

如上,实验性地,我尝试为了python-mode制定唯一后端company-ispell,然而但我打开一个py文件时,通过Eval查看后端的值,发现仍然为默认的:

  (company-bbdb company-semantic company-cmake company-capf company-clang company-files (company-dabbrev-code company-gtags company-etags company-keywords) company-oddmuse company-dabbrev)

这又是什么原因了?怎样改正它??

company-backends是非buffer local(全局)变量,你改了之后有些mode会把它再改回来,比如lsp。用setq-local


一个变量使用defvar声明出来是全局一份,对它setq会改全局的值;用defvar-local声明出来是buffer local的,对它setq只会改当前buffer的值。

C-h v一个buffer local变量时可以看到在它的文档开头有“automatically becomes buffer-local when set”字样。

非buffer local变量可以用setq-local在当前buffer中给一个值,在这个buffer之外这个变量依然是全局一个。

3 个赞

这算是必杀技了. 很遗憾绝大多数company相关的教程和文章对于company-backends都没有涉及.