关于使用php-extras补全后,company上下文补全失效

在spacemacs中配置php-extras函数自动补全.

php函数补全成功,但是company的上下文自动补全却无法显示

请问下如何解决,附上配置图片:

成功补全php函数

无法补全变量

spacemacs的个人layer配置

应该是 backends 没有设置好,贴出你的 php-mode 下的 company-backends 变量的值看看。

另外你要的上下文补全,是不是指 company-dabbrev?如果是的话,把它和 company-php (是不是这个?还是说你用的 company-capf?我没有用过 php-mode,这里只是猜测,但是基本意思就是这)并列作为你的 company-backends 变量的第一项应该就ok了。

谢谢你的回答.

我看了一下backends,但是我把php-extras放在第二位后php-extras就失效了。默认php-extras是放在第一位。

之前也遇到类似问题(我用的是 ac-php),php 内置函数和用户定义的类成员(部分)能补齐,但是当前 buffer 里的变量不会出现在补全列表中。

company-backends 看起来没问题,该有的都有:

(company-ac-php-backend company-tern
                        (company-capf company-dabbrev-code)
                        company-dabbrev)

似乎 company 在处理多个 backend 时还存在问题,以下帖子都提到:

不过里边的解决方式不可取,会造成全局污染。我最后的解决方案是,TAB 的时候自己调用 company-dabbrev-code:

(defun indent-or-complete ()
  "缩进/补全本地变量"
  (interactive)
  (let ((chr (char-before (point))))
    (if (or (and (>= chr ?0) (<= chr ?9))
            (and (>= chr ?A) (<= chr ?z)))
        (call-interactively 'company-dabbrev-code)
      (call-interactively 'indent-for-tab-command))))

(add-hook 'php-mode-hook
          (lambda ()
            (define-key php-mode-map (kbd "TAB") 'indent-or-complete)))

内置函数和类成员自动补,buffer 变量手动补全,就这样吧,反正这个世界本来就不完美(主要还是无力解决 company 本身的问题,看到源代码头痛😄)

试试

((php-extras-company company-dabbrev) ....)

注意前面两个是用一对括号括起来的,表明是复合 backend。还有就是注意应该是 company-dabbrev 而不是 company-abbrev

dabbrev = dynamic abbrev 意为动态缩写

1 个赞

谢谢你的回答,按照你的回答问题解决了。

万分感谢。

谢谢你的回答,我按照@et2010 的方法解决了。

我放弃 spacemacs 很久了,不知道它现在 php 补全效果如何?我平时也写 php,所以对这块比较关心。但是刚才小试了一下,并不太理想,不知道是不是我配置漏掉了什么。

  • master 分支(* 8e1af145 Fix typo in release note [syl20bnr] 2017-04-06)

    效果如下:

    可以看到,company 只是把当前 buffer 里的关键字列出来,甚至 $this-> 的补全项里面有 this / private / function 这些。

  • develop 分支(* ca28bde0 purpose: disable popwin-mode at startup [bmag] 2017-09-16)

    我看到 develop 分支已经添加 ac-php, 应该是为了改善 master 分支不能补全类成员的问题(ac-php 本身其实也不太完善), 但是可能被谁 push 坏掉了,直接 No completion found.

我的配置文件很简单,只启用 helm, auto-completion, php 三个 layer:

⋊> diff -u ./core/templates/.spacemacs.template .spacemacs
--- ./core/templates/.spacemacs.template        2017-08-18 18:14:40.000000000 +0800
+++ .spacemacs  2017-09-19 11:05:23.000000000 +0800
@@ -36,9 +36,10 @@
      ;; `M-m f e R' (Emacs style) to install them.
      ;; ----------------------------------------------------------------
      helm
-     ;; auto-completion
+     auto-completion
      ;; better-defaults
      emacs-lisp
+     php
      ;; git
      ;; markdown
      ;; org

我用的是company+php-extras+php-mode

自己测试了下在php上面补全还可以。

在.spacemacs.d用户配置custom-set-variables里面添加backends设置,代码如下

 ;; 设置company补全
 '(company-backends
   (quote
    (
     (company-dabbrev php-extras-company)
     company-dabbrev company-bbdb company-nxml company-css company-eclim company-semantic company-clang company-xcode company-cmake company-capf company-files
     (company-dabbrev-code company-gtags company-etags company-keywords)
     company-oddmuse company-dabbrev)
    ))

不知道能不能帮到你,你试试看。

你好,怎么解决的,我也遇到同样的问题,可以分享下配置吗,我也在用spacemacs 写 php

这句话是不是写出来的和想的反了?buffer内的变量可以dabbrev补全,内置函数自己人肉写出来?

没反。由于 company 可能存在问题,导致复合 backends 没有完全起作用,自动补全只有:

  • 内置函数
  • autoload 加载的类以及类成员

但是当前 buffer 或者函数里的变量没有出现在补全列表,所以额外绑定快捷键手动执行 dabbrev。

因为电脑比较卡,所以我的个人配置比较简单github地址

关于补全那块答复上面有是写在.spacemacs.dcustom-set-variables里面。

1 个赞