能用于c++补全吗?
可以,配合cquery。
你说的cquery是什么?
比起我现在用的company-clang来补全, lsp + cquery 会更好吗?
cquery 裏 #i
(#include
)
顯示效果正常
但是按回車確認補全項時輸出 #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. 可能最好同时有两个候选,一个带参数列表,一个不带。。。)
但是按回車確認補全項時輸出 #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扩展。
(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
加载的
二分法,专治疑难杂症。
我现在的水平只能抄抄配置,二分法什么的根本不知道从哪里下手
不需要二分,这个情况我见过,是company-lsp的snippet支持没有开启导致的。
原因是(require 'company-lsp)
发生在(lsp-cquery-enable)
之后,没有把snippet的支持传给cquery。cquery在客户端不支持snippet的情况下对于任何函数都只补全左括号。
把你的cquery和company-lsp配置贴上来看看,按我之前说的应该是可以解决的。