幫忙改進 C++ LSP 體驗

Sorry, 可能之前描述问题不如 @yclin 清晰, 最近在恶补emacs的一些知识, 顺便看看cquery的源码, 希望以后能有所帮助.

cquery崩溃后, 是否有不重启emacs就使cquery重新运行的方法?).

M-x projectile-kill-buffers,重新打开一个文件

有時候正常退出lsp--workspaces沒有remhash,需要(setq lsp--workspaces (make-hash-table :test #'equal) 我碰到這個情況了

  1. 使用 compile_commands.json.cquery 有什么区别?
  2. 用什么工具生成 .cquery,还是只能手打+脑补?
  3. cquery 可以直接生成 .cquery_cached_index 而不启动编辑器吗?

使用 compile_commands.json 和 .cquery 有什么区别?

https://github.com/cquery-project/cquery/wiki/Getting-started#project-setup

推薦compile_commands.json,如果難以生成則.cquery

用什么工具生成 .cquery,还是只能手打+脑补?

手打。

cquery 可以直接生成 .cquery_cached_index 而不启动编辑器吗?

需要一個language client,現在無已知好用的cli tool

遇到了个新问题…

git pullcquery之后, 发现已经使用了clang6.0, 在执行

git submodule update --init && ./waf configure build --variant=debug

之后, 正常编译通过. (我的电脑本身没有装clang)

Setting top to                           : /home/allen/tools/cquery 
Setting out to                           : /home/allen/tools/cquery/build 
Checking for 'clang++' (C++ compiler)    : not found 
Checking for 'g++' (C++ compiler)        : /usr/bin/g++ 
Checking for header stdio.h              : yes 
Checking for clang
Found extracted at build/clang+llvm-6.0.0-x86_64-linux-gnu-ubuntu-14.04
Checking for library clang               : yes 
Clang includes                           : ['/home/allen/tools/cquery/build/debug/lib/clang+llvm-6.0.0-x86_64-linux-gnu-ubuntu-14.04/include'] 
Clang library dir                        : ['/home/allen/tools/cquery/build/debug/lib/clang+llvm-6.0.0-x86_64-linux-gnu-ubuntu-14.04/lib'] 

但是运行的时候, 却报告找不到clang5:

allen@Allen-PC:~/tools/cquery/build/release/bin$ ./cquery 
./cquery: error while loading shared libraries: libclang.so.5: cannot open shared object file: No such file or directory

我不太确定时哪里连接的这个库…

ldd build/debug/bin/cquery

应该显示................clang+llvm-6.0.0-x86_64-linux-gnu-ubuntu-14.04/lib/libclang.so.6

哦, debug的版本build出来的路径不在release下了, 这个是我没仔细看编译结果的问题…

@MaskRay

cquery 对所有派生自 c 的 mode 都有影响,比如 php-mode。当打开 .php 文件的时候,c-mode-hook 首先触发,然后启动 cquery,结果导致 php language server 反而没有启动。我目前的解决方案是:

(defun my/lsp-cquery-enable ()
  (when (member major-mode '(c-mode cc-mode c++-mode objc-mode))
    (set (make-variable-buffer-local 'company-backends) '(company-lsp))
    (lsp-cquery-enable)))

(add-hook 'c-mode-hook #'my/lsp-cquery-enable)

是不是可以考虑像 irony 一样,增加一个 -supported-major-modes,避免跟派生 mode 冲突:

1 个赞

你去发个PR吧。反正我不能merge了,也不想多碰这个项目了

你不是单干ccls了吗,怎么还鼓捣cquery

3月20+還對clangd抱有幻想,4月1日對cquery徹底失望,但又覺得xref還得靠自己,後來才弄的ccls

支持windows不,cquery补全有点慢啊。为什么qtcreator补全那么快,都是用的libclang,

file mode specificat ion erro (user-error could not find ccls project root) ccls 启动不了

重新编译的, 不能找到root 目录 然后连ccls服务也没有启动,按着 你的wiki 设置的

lsp-ccls-enable調用ccls--get-root查找項目根目錄。呼叫了(projectile-project-root),請確保這個正常返回

1 个赞

新建了一个 .projectile 文件正常了,你把默认的.ccls文件匹配改成了projectile了吗 ,看源码好像是

或者用.ccls-root.ccls每個子目錄都可以用,影響期中的檔案。因此我不想讓.ccls決定根目錄。

1 个赞

怪不得,如果只有compile_commands.json呢,我以前试过,当时应该也不行,可以看这里

有些人專案的build directory放在同一級,有些build directory放在專案內(我用這一種)

llvm
  release
    include
      llvm
        Config
          config.h
    compile_commands.json
  debug
    compile_commands.json

如果把compile_commands.json作爲根標記,config.h的根就會標錯到llvm/release了。因此與其設置多個規則,我就簡單地用projectile和.ccls-root。這樣的壞處是:你下載一些archive比如musl-1.1.19.tar.gz,解壓,如果裏面沒有.git等projectile識別的標誌,就認不出根。

1 个赞

喔喔,我当时用json试的时候确实没有.git。