请问我的emacs 在makefile mode下为什么company插件无法自动补全

为何makefile模式下无法对我前文输入过的字符串进行补全呢?

其他模式下都可以的,请问如何查找这个问题?或者如何设置?

补全关键字 (k)、Snippet (S)、代码中的单词 (w) 和非代码中的单词 (w)。 如果觉得噪音太大可以把第三行注释去掉:

(defun makefile-mode-setup ()
  (setq-local company-dabbrev-ignore-case t)
  ;; (setq-local company-dabbrev-other-buffers nil)
  (setq-local company-dabbrev-code-ignore-case t)
  (setq-local company-backends '((company-dabbrev-code
                                  company-keywords
                                  company-yasnippet
                                  company-dabbrev
                                  :separate)))
  (setf (alist-get major-mode company-keywords-alist)
        (-uniq
         (append makefile-statements
                 makefile-special-targets-list
                 (->> (pcase major-mode
                        ('makefile-automake-mode makefile-automake-statements)
                        ('makefile-gmake-mode makefile-gmake-statements)
                        ('makefile-makepp-mode makefile-makepp-statements)
                        ('makefile-bsdmake-mode makefile-bsdmake-statements)
                        ('makefile-imake-mode makefile-imake-s))
                      (-filter #'stringp)
                      (-map #'split-string)
                      (-flatten))))))

(with-eval-after-load 'company
  (require 'make-mode)
  (dolist (hook '(makefile-gmake-mode-hook
                  makefile-makepp-mode-hook
                  makefile-bsdmake-mode-hook
                  makefile-imake-mode-hook))
    (add-hook hook #'makefile-mode-setup)))

image

image

1 个赞

感谢答复!我马上试试

确实可用,谢谢!

(require 'make-mode) 这行应该可以去掉,你试试。

这个 keywords 我感觉可以扔到 company-mode 上游去,毕竟 Makefile 也算是一个比较常用的格式

我打算先提个 pr 让 company-keywords 支持 ignore case。

@chenbeihp @Youmu

keywords 已经合并到 compay-mode 了,也加了 company-dabbrev-ignore-case 开关允许用小写补全大写关键字。

但是 company-backends 还是要自行设置,否则会因为受干扰而无法发挥作用。

(defun makefile-mode-setup ()
  (setq-local company-keywords-ignore-case t)
  ;; (setq-local company-dabbrev-other-buffers nil) ;; 如觉干扰太大开启这行
  (setq-local company-dabbrev-ignore-case t)
  (setq-local company-dabbrev-code-ignore-case t)
  (setq-local company-backends '((company-dabbrev-code
                                  company-keywords
                                  company-yasnippet
                                  company-dabbrev :separate))))

(with-eval-after-load 'company
  (add-hook 'makefile-mode-hook #'makefile-mode-setup))

另,国内的几个 elpa 镜像好像又停更几天了,我现在换 Boris / elpa-mirror · GitLab