使用use-package设置company-mode的bind后, company-mode无法自动激活, 什么原理?

company的激活后默认使用M-n, M-p选项, 想添加 C-n C-p的键绑定.代码如下:

(use-package company
  :ensure t
  :bind (
         :map company-active-map
         (("C-n"   . company-select-next)
          ("C-p"   . company-select-previous)
          ("C-d"   . company-show-doc-buffer)
          ("<tab>" . company-complete))
         )
  :config
  (progn
    (global-company-mode t)
    (setq company-backends
          '((company-dabbrev
             company-abbrev
             company-yasnippet
             )
            (company-capf )))
    )
  )

启动后, 发现company-mode没加载上, 需要输入两次M-x company-mode , 才行.

解决办法也有. 就是键绑定的代码不要写到第一个 use-package里去.

第一种, 在(use-package company …), 里面不要写键绑定的代码, 之后再单独写一个键绑定的:

(use-package company
    :bind (
         :map company-active-map
         (("C-n"   . company-select-next)
          ("C-p"   . company-select-previous)
          ("C-d"   . company-show-doc-buffer)
          ("<tab>" . company-complete))
         )
)

第二种, 其实和第一种一样, 在use-package之后, 用with-eval-after-load也行

(with-eval-after-load 'company
  (define-key company-active-map (kbd "\C-n") #'company-select-next)
  (define-key company-active-map (kbd "\C-p") #'company-select-previous)
  (define-key company-active-map (kbd "\C-d") #'company-show-doc-buffer)
  (define-key company-active-map (kbd "<tab>") #'company-complete)
  ;;   (define-key company-active-map (kbd "M-n") nil)
  ;;   (define-key company-active-map (kbd "M-p") nil))
  )

只是不明白为何把键绑定的代码写进同一个(use-package …), 就会造成company-mode加载不上呢?

加入键绑定会自动触发延迟加载,如果不需要延迟加载的话可以使用 demand 关键字

https://phenix3443.github.io/notebook/emacs/modes/use-package-manual.html#orgb4c00bf

4.9.1 延迟加载的注意事项
几乎所有情况下都不需要手动指定 :defer t 。每当使用 :bind 、 :mode、 ~:interpreter 时,这都是隐含的。 
通常,如果知道其他 package 会做一些事情导致当前 package 在适当的时间加载,只需指定 :defer, 
因而即使 use-package 不会为你创建任何自动加载,也会推迟加载。

可以使用 :demand 关键字覆盖包的延迟加载。
因此,即使使用 :bind ,使用 :demand 也会强制立即加载,不会为绑定键建立任何自动加载。
1 个赞

use-package是一个宏 你需要把他展开

去掉其中的错误处理函数

然后看看出了什么错

1 个赞
:config
(global-company-mode)

:init (global-company-mode) 我用use-package evil, :config的时候遇到过类似的问题,换成:init就好了。

1 个赞

我这里两种都能自动加载company。

:init/:config (global-company-mode)