company-lsp 终于来了

能用于c++补全吗?

可以,配合cquery。

你说的cquery是什么?

比起我现在用的company-clang来补全, lsp + cquery 会更好吗?

Much better. GitHub - jacobdufault/cquery: C/C++ language server supporting multi-million line code base, powered by libclang. Emacs, Vim, VSCode, and others with language server protocol support. Cross references, completion, diagnostics, semantic highlighting and more

1 个赞

cquery 裏 #i (#include)

顯示效果正常 screen

但是按回車確認補全項時輸出 #include <aio.h>include <aio.h> 。不知道是誰的鍋

read /home/maskray/Dev/Util/cquery/build/release/bin/cquery
{"jsonrpc":"2.0","method":"textDocument/completion","params":{"textDocument":{"uri":"file:///tmp/c/a.cc"},"position":{"line":0,"character":2}},"id":789}
write /home/maskray/Dev/Util/cquery/build/release/bin/cquery
{"jsonrpc":"2.0","id":789,"result":{"isIncomplete":true,"items":[{"label":"#include <aio.h>","kind":9,"detail":"aio.h","documentation":"","sortText":"","insertText":"","insertTextFor
mat":1,"textEdit":{"range":{"start":{"line":0,"character":0},"end":{"line":0,"character":2}},"newText":"#include <aio.h>"}},{"label":"#include <algorithm>","kind":9,"detail":"algorit
hm","documentation":"","sortText":"","insertText":"","insertTextFormat":1,"textEdit":{"range":{"start":{"line":0,"character":0},"end":{"line":0,"character":2}},"newText":"#include <algorithm>"}},{"label":"#include <any>","kind":9,"detail":"any","documentation":"","sortText":"","insertText":"","insertTextFormat":1,"textEdit":{"range":{"start":{"line":0,"character":0},"end":{"line":0,"character":2}},"newText":"#include <any>"}},{"label":"#include <arpa/inet.h>","kind":9,"detail":"arpa/inet.h","documentation":"","sortText":"","insertText":"","
insertTextFormat":1,"textEdit":{"range":{"start":{"line":0,"char

这和emacs-lsp是什么关系?

company-lsp配合cquery确实不错,不过——

第一,punctation好像没有自动补全?我设置了company auto complete char的,但按.候选出不来,我同时选了symbol,这个可以。

第二,图片演示的n:type自动变成symbol是怎么弄的?我直接显示的${0:type}之类的。。。(p.s. 可能最好同时有两个候选,一个带参数列表,一个不带。。。)

@tigersoldier

交换label和detail,效果怎么样?

我company懂得很少。需要company-lsp作者看

但是按回車確認補全項時輸出 #include <aio.h>include <aio.h> 。不知道是誰的鍋

@MaskRay 这个问题在issue list里有讨论:Suggested snippets for something already completed (c/c++ includes as an example) · Issue #21 · tigersoldier/company-lsp · GitHub

简单来说是company-lsp有个自动连续补全的功能,当补全的后缀是可能触发补全的字符时,company-lsp会自动触发新的补全。这个功能对补全std::之类的很有用。

然而>是一个触发字符,但是cquery补全的prefix和lsp-mode/company-lsp的prefix不一致。当在>处补全时,company-lsp认为待补全的内容是>后面的空串,而cquery认为是整行#include。于是cquery把整行内容返回回来,而company-lsp认为它是在光标后的新内容。当你按回车继续补全时会发现内容并没有改变。

第一,punctation好像没有自动补全?我设置了company auto complete char的,但按.候选出不来,我同时选了symbol,这个可以。

什么符号没有补全?company-lsp是使用cquery提供的trigger character的。跟在trigger character后面的应该都能触发补全才对。

第二,图片演示的n:type自动变成symbol是怎么弄的?我直接显示的${0:type}之类的。。。(p.s. 可能最好同时有两个候选,一个带参数列表,一个不带。。。)

这个应该是个bug。cquery返回的内容是带textEdit的,目前company-lsp只针对insertText作了snippet扩展。

lsp-java应该支持语义跳转。不喜欢安装Eclipse的话可以试试我的lsp-javacomp :smiley:

2 个赞

@tigersoldier 我遇到了一个在自动不全带参数的函数时,被截断在左括号的问题,请问如何确定到底是哪里配置错了呢?

  (with-eval-after-load 'smartparens
    (assq-delete-all :unmatched-expression sp-message-alist))

应该是个bug。你试试关闭所有C++文件(包括.h)再打开看看

这个上次试过了,我还尝试了把smartparens加入excluded packages,问题依然存在。

这个bug在我这里必现,每次打开第一个文件就会出现问题,我用的spacemacs,不知道是否和其他包有冲突

你看下这个字符串是不是来自 smartparens

这个包有点功能,但是自动补齐括号这种功能我觉得特别烦

估计你是用了延迟加载的功能?在lsp-cquery-enable之前强制(require 'company-lsp)试试?

字符串应该是来自这个包,但是把这个包exclude之后,提示的message没有了,但是补全的状态是一样的,还是被截断。

这个好像没什么效果,我是按照 @MaskRay 的配置抄了一个layer,用use-package加载的

二分法,专治疑难杂症。

我现在的水平只能抄抄配置,二分法什么的根本不知道从哪里下手 :joy:

不需要二分,这个情况我见过,是company-lsp的snippet支持没有开启导致的。

原因是(require 'company-lsp)发生在(lsp-cquery-enable)之后,没有把snippet的支持传给cquery。cquery在客户端不支持snippet的情况下对于任何函数都只补全左括号。

把你的cquery和company-lsp配置贴上来看看,按我之前说的应该是可以解决的。