company-lsp 终于来了

如果lsp-cquery不支持同时多个workspace, 最好是初始化(启动language server)的时候提示用户选择workspace目录, 之后就固定用这个目录.

如果lsp-cquery支持同时多个workspace, 这个有点混乱, 一个文件可能属于多个workspace,只能让用户手工选择, 或者让用户提供规则或优先级顺序.

自动检测结果最好提示一下用户, 让用户知道, 否则很疑惑. 我是把那个get-root的函数改掉了.

有compile_commands.json的时候, cquery是不是只索引compile_commands.json里面包含的文件? 会索引其他文件吗?

另外就是,python有一个package auto-virtualenv,则是使用project root下一个文件作为标识

C/C++ 把包扔给系统管了,然后编译的时候各种参数、环境变量。

我觉得就识别有.cquerycompile_commands.json的目录就行了,这个是cquery自身可控的,就算compile_commands.json是构建工具生成的,不完全由cquery控制,但是cmake不是也可以include别的目录吗,项目根目录一般也把别的目录包含进来了。

搜了一下,还是有不少 c/c++ 包管理器的:

为什么没有一个成为主流呢,应该是难以达成共识,就像 Linux 发行版一样。

一开始就把系统软件包跟开发混为一用了,也没有 global / local 之分。版本依赖怎么办,就各种环境变量 flag 来处理,然后有了各种复杂无比的构建工具 make/cmake/waf/ninja… 一代代开发者都是这么熬过来的,然后还有点上瘾了。

2 个赞

这个我感觉可能性不大 :slight_smile:

cquery 支持 hierarchical .cquery,子目录 .cquery 文件影响所在子树的编译选项

compile_commands.json可以在 project/build/compile_commands.json 并且旁边有生成文件 project/build/generated.cc

等几个月等这个被作者捡起来吧 T_T

@tigersoldier

还有一个问题,好像company-lsp在匹配失败的时候也会强制换成候选的第一个,怎么让它不强制替换成第一个?

另外一个想请教的事情是,我好像设置过不补全参数表的,但我现在想补全参数表,但没找到在哪里了。。。隐约记得原来用company-clang的时候这么设置过。。。现在的表现是有参数的话,补全选中只有函数名字,没有参数的话,选中后会有括号。

这应该是之前的一个bug,更新之后还有这个问题吗? 如果有欢迎提issue。

company-lsp-enable-snippet?

第一个更新后没有了,第二个的话,company-lsp-enable-snippet我没有改动它,就是默认的on

你的配置是怎样的?建议强在调用lsp-xxx-enable之前先(require 'company-lsp),要不然会出现不能开启snippet的情况

这一楼.emacs中改动了两处:

第一处,my//enable-cquery-if-compile-commands-json改成了:

(defun my//enable-cquery-if-compile-commands-json ()
  (when
      (or (locate-dominating-file default-directory "compile_commands.json")
          (locate-dominating-file default-directory ".cquery"))
    (require 'company-lsp)
    (lsp-cquery-enable)))

第二处,company-backends改成了:

    (company-c-headers company-lsp company-bbdb company-nxml company-css company-cmake company-capf company-files
                       (company-dabbrev-code company-keywords)
                       company-oddmuse company-dabbrev)

https://github.com/emacs-lsp/lsp-mode/issues/293#issuecomment-370311956修好就不需要這個my//enable-cquery-if-compile-commands-json wrapper了

1 个赞

无法补全参数不像是由于配置错误造成的。开启lsp-print-io后尝试补全,*Messages*里的内容是什么?

开启方法:M-x set-variable <RET> lsp-print-io <RET> t

顺便给一下company-diag的输出呗。

struct foo_foo {
    int bar_bar;
    int bar(int);
};

void foo()
{
    foo_foo foo000;
    foo000.bar_bar;
    foo000.bar//choose bar here
}

lsp-print-io:

Output from language server: {"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"uri":"file:///home/mark/test/etest/test.cc","diagnostics":[{"range":{"start":{"line":9,"character":14},"end":{"line":9,"character":14}},"severity":1,"source":"cquery","message":"expected ';' after expression"},{"range":{"start":{"line":9,"character":4},"end":{"line":9,"character":14}},"severity":1,"source":"cquery","message":"reference to non-static member function must be called"},{"range":{"start":{"line":8,"character":4},"end":{"line":8,"character":18}},"severity":2,"source":"cquery","message":"expression result unused [-Wunused-value]"}]}}

company-diag:

company-call-backend-raw: Company: backend company-lsp error "Wrong type argument: listp, t" with args (candidates (bar . t))

有没有带 textDocument/complete 的请求信息呢?尝试补全一个函数应该会产生若干条这样的请求

另外把所有的buffer都关掉再打开一个文件,看看能不能补全参数?

有人用lsp php的么?感觉怎么样?