company-lsp 终于来了

这里是我抄的一个layer,用来配置cquery的。spacemacs的配置也是这个仓库的上级目录

(add-hook 'c-mode-common-hook 'lsp-cquery-enable)

这句改成

(add-hook 'c-mode-common-hook
  (lambda ()
    (require 'company-lsp)
    (lsp-cquery-enable)))
1 个赞

修改了之后没有效果。。

去掉这一行

company-lsp-enable-snippet nil

这次可以了,需要同时实现上面两个修改才能正常。我看参数说明以为company-lsp-enable-snippet只是不展开yas-snippet的东西,是理解错误了吗?

另外还有一个问题,每次输入#的项目,都会弹出头文件的自动补全,但有的时候如#define#if这种是不需要进行头文件补全展开的,而且每次弹出补全列表之前都会卡很久,所以像输入

#define MAX_BUFFER_SIZE  1024

这种东西时会变得非常困难。。。

snippetSupport 为 false 则遇到第一个 placeholder 结束(tri-state)

Sorry, 我有点不太明白, 这个链接是修复问题的PR吗? 还是本来期待的行为就是以前那样的?

这里有个概念没说明白的地方。company-lsp的snippet指的是展开LSP返回的snippet,而不是yasnippet自带的snippet。你打开后应该就看到cquery函数补全的效果了,也就是readme截图里的效果。之所以提到yasnippet是因为使用了yasnippet来实现这个功能。

1 个赞

还有一个问题是, 当company找不到和输入相匹配的补全项时, 会弹出一个默认的补全列表. 我期望的效果是找不到匹配的内容就不要弹出东西了, 有办法配置成这样吗?

最近修了几个bug,更新一下看看?

1 个赞

我是刚刚在github上更新的cquery, 通过spacemacsmelpa上更新的lsp-mode company-lsp等包, 依然有前面提到的问题, 这里是个演示: replay

我最主要的问题是, 一旦在一个稍微大一些的工程里面进行这种操作, 弹出列表之后emacs会变得非常的卡, 让我很难受…

更新一下状态: 将上面几个包更新过后, 不设置异步补全 (;; (setq company-lsp-async t)) 的时候emacs卡顿的问题没有了, 打开这个注释后才会卡顿. 更新之前是同步就卡, 异步更卡… 我的系统是装在移动硬盘里的, 不知道是不是补全的时候会大量操作硬盘读写

有可能自动补全这么受欢迎的原因之一是绝大多数人打字太慢了...

1 个赞

懒惰是程序员的优良品德, 能按3个键就完成的事情我绝对不会按4个…

1 个赞

主要是怕打错

1 个赞

我感觉最有可能的是记不住变量和函数名。。。。

即使错,也要错成一样,这就是自动补全的好。自动补全不能用的地方,我尽量复制粘贴。

2 个赞

以为你没回复我呢,抱歉这么晚才看到,过节时没碰代码。

补全是有的,我设置的company-auto-complete-charssymbolpunctuation两个,symbol可以自动出来,但直接在对象后按.出不来,需要手动在.后面执行M-x -ls才出得来。

顺便,lsp-enable-comletion-at-point是默认值,在customize group中显示是oncompany-capf也在company-backends中。

可以列出你的配置代码和用来测试补全的c++代码吗?最好列一下M-x company-diag的结果。

回头看了一下你原来的问题:

  1. company-auto-complete-char不是用来实现你想要的功能的。company-lsp默认应该支持cquery的.自动触发补全。

  2. 要实现补全参数的效果,company-lsp需要被提前加载。可以使用如下配置:

    (add-hook 'c++-mode-hook 
       (lambda ()
          (require 'company-lsp)
          (lsp-cquery-enable)))
    
  3. lsp-enable-comletion-at-pointcompany-capf对于company-lsp没有任何作用

c++代码:

struct foo_foo {
    int bar_bar;
};

void foo()
{
    foo_foo foo000;
    foo000.  //光标停留此处
}

.cquery文件:

# Driver
clang++

# Language
-xc++

M-x company-diag内容:

Emacs 25.3.1 (x86_64-pc-linux-gnu) of 2018-02-09 on bisson
Company 0.9.4

company-backends: (company-bbdb company-nxml company-css company-eclim company-semantic company-xcode company-cmake company-capf company-files
              (company-dabbrev-code company-gtags company-etags company-keywords)
              company-oddmuse company-dabbrev company-lsp)

Used backend: company-capf
Major mode: c++-mode
Prefix: ""
Completions:
  #("operator=(${1:const foo_foo &})$0" 0 1 (lsp-completion-item #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8 data ("label" "operator=" "kind" 2 "detail" "foo_foo & operator=(const foo_foo &)" "documentation" "" "sortText" "..........1" "insertText" "operator=(${1:const foo_foo &})$0" "filterText" "operator=" "insertTextFormat" 2)) face (completions-first-difference)) 1 33 (lsp-completion-item #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8 data ("label" "operator=" "kind" 2 "detail" "foo_foo & operator=(const foo_foo &)" "documentation" "" "sortText" "..........1" "insertText" "operator=(${1:const foo_foo &})$0" "filterText" "operator=" "insertTextFormat" 2)))) " foo_foo & operator=(const foo_foo &) (Method)"
  #("~foo_foo()" 0 1 (lsp-completion-item #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8 data ("label" "~foo_foo" "kind" 4 "detail" "void ~foo_foo()" "documentation" "" "sortText" "..........0" "insertText" "~foo_foo()" "filterText" "~foo_foo" "insertTextFormat" 1)) face (completions-first-difference)) 1 10 (lsp-completion-item #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8 data ("label" "~foo_foo" "kind" 4 "detail" "void ~foo_foo()" "documentation" "" "sortText" "..........0" "insertText" "~foo_foo()" "filterText" "~foo_foo" "insertTextFormat" 1)))) " void ~foo_foo() (Constructor)"
  #("foo_foo::" 0 1 (lsp-completion-item #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8 data ("label" "foo_foo" "kind" 22 "detail" "foo_foo::" "documentation" "" "sortText" "........../" "insertText" "foo_foo::" "filterText" "foo_foo" "insertTextFormat" 1)) face (completions-first-difference)) 1 9 (lsp-completion-item #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8 data ("label" "foo_foo" "kind" 22 "detail" "foo_foo::" "documentation" "" "sortText" "........../" "insertText" "foo_foo::" "filterText" "foo_foo" "insertTextFormat" 1)))) " foo_foo::"
  #("bar_bar" 0 1 (lsp-completion-item #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8 data ("label" "bar_bar" "kind" 5 "detail" "int bar_bar" "documentation" "" "sortText" "..........." "insertText" "bar_bar" "filterText" "bar_bar" "insertTextFormat" 1)) face (completions-first-difference)) 1 7 (lsp-completion-item #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8 data ("label" "bar_bar" "kind" 5 "detail" "int bar_bar" "documentation" "" "sortText" "..........." "insertText" "bar_bar" "filterText" "bar_bar" "insertTextFormat" 1)))) " int bar_bar (Field)"

.emacs中相关配置:

(require 'cquery)
(setq cquery-executable "/usr/bin/cquery")
(defun my//enable-cquery-if-compile-commands-json ()
  (when
      (or (locate-dominating-file default-directory "compile_commands.json")
          (locate-dominating-file default-directory ".cquery"))
    (lsp-cquery-enable)))
(add-hook 'c-mode-common-hook
          (lambda ()
            (setq tab-width 4)
            (smart-tabs-mode 1)
            (my//enable-cquery-if-compile-commands-json)))

(custom-set-variables
 '(company-auto-complete t)
 '(company-auto-complete-chars (quote (95 46)))
 '(company-backends
   (quote
    (company-bbdb company-nxml company-css company-eclim company-semantic company-xcode company-cmake company-capf company-files
                  (company-dabbrev-code company-gtags company-etags company-keywords)
                  company-oddmuse company-dabbrev company-lsp)))
 '(company-lsp-async t)
 '(company-lsp-cache-candidates nil)
 '(company-lsp-enable-recompletion t)
 '(lsp-enable-flycheck nil)
 '(lsp-enable-indentation nil)
 '(lsp-highlight-symbol-at-point nil)
 '(package-selected-packages
   (quote
    (company-lsp cquery lsp-mode smart-tabs-mode fill-column-indicator flycheck-clang-analyzer flycheck ## clang-format cl-lib company geiser smart-mode-line smartparens))))

顺便,我看上面有人设置了自动不补全参数,我没看到在哪里设置啊。。。

1 个赞

你的company-backends里没有使用company-lsp。建议你把它加到第一位。并且在(lsp-cquery-enable)之前加上(require 'company-lsp)

1 个赞