ccls 0.20190823.3 released

https://github.com/MaskRay/ccls/releases/tag/0.20190823

ccls是一個C/C++/ObjC language server。可以接入lsp-mode eglot等language clients,提供類似IDE的開發體驗。有很多貼文介紹過LSP用法了,這裏不做更多說明。移步 lsp mode · MaskRay/ccls Wiki · GitHub https://github.com/MaskRay/ccls/wiki/eglot

這次release的改進:

LSP conformance

  • Support null as initializationOptions
  • Set declarationProvider in server capabilities. Some client may need this capability to enable textDocument/declaration
  • Support non-numeric request ID #437

Misc

  • Fix a double-free of llvm::MemoryBuffer when parsing fails #350
  • Keep comments from system headers and improve textDocument/hover #373
  • Fix the conformance issue that VersionedTextDocumentIdentifier.version was omitted. If one renames something spanning more than one document and some documents are not opened, the client may not apply the textDocument/rename change. #387
  • Some macro diagnostics were lost because Note::concerned was not propagated to Diag::concerned #391
  • index.onChange: true support non-existent files #443
  • textDocument/definition: don’t jump to the type definition
  • Disable warnings and skip processed function bodies. This should provide massive performance improvement when indexing a project. I measured 2x improvement indexing ccls with 2 threads, more than 2x indexing llvm/clang/extra/lld/compiler-rt with 6 threads. :clown_face: 這個索引性能提升是最大的亮點了

Project

  • Fix some issues with hierarchical .ccls in #384
  • .ccls: support CUDA files with the %cu directive
  • compilationDatabaseDirectory can be absolute. #466
  • Improve heuristics for files not described by compile_commands.json "… but not so well for projects with separate include and source directories, e.g. “inc/long/path/to/my_file.h” and “src/long/path/to/my_file.cc” #441

Windows

  • A Visual Studio 2017 STL bug prevented clang-cl from compiling ccls/src/utils.hh #371 #414
  • If the file is re-saved before the previous indexing has complete, various ambiguous errors might occur. Fixing this by making opened files volatile #235 #453

Extension requests

  • $ccls/fileInfo: can optionally dump dependencies, includes and skipped_ranges

這個版本後打算統一一下variable/function命名規範,希望有好心人能測試下 rename branch https://github.com/MaskRay/ccls/tree/rename

git clone --branch=rename https://github.com/MaskRay/ccls
cd ccls
git submodule update --init
cmake -H. -BRelease -DCMAKE_PREFIX_PATH=/usr/local/llvm80  ## 這是FreeBSD的。其他系統見 https://github.com/MaskRay/ccls/wiki/Build
make -C Release -j
8 个赞

牛逼 支持 666666666

6666,支持大佬

前几天刚编译了一个版本,看来又要更新了.不过我有时候总是遇到头文件里无法补全,但是cpp里可以补全.不知道怎么回事.模板函数.另外一个问题就是,补全候选项感觉没有clangd好用.不知道是不是我设置问题.clangd与ccls的补全内容排序,个人感觉clangd好一些.ccls每次我都是输入尽量多的字母,才能匹配到我想要的.大部分情况下.我输入字母很少时,比如2个.出来5个候选结果.恰恰最后一个是我想要的.而clangd,会将我想要的放在第一位.我观察了两者的结果排序.clangd是优先精确匹配,比如我输入gr,想要补全graph.clangd会将graph放在第一位.而ccls放在第一位的可能是algorithm.我有设置company-transformersnil

1 个赞

支持一下

说起来我昨天用debian9编译ccls都快被折腾吐血了,不管是cmake还是gcc,内置apt的版本号都太低了。。自己手动编译gcc后还是有问题,编译出来的ccls直接弹出错误,简直了。。

Ccls GitHub wiki上有安装gcc 7的教程

那是ubuntu,不是debian

不过没关系,我已经回到ubuntu的怀抱了

多谢大佬,不过公司机器gcc太老。。用的cls总core。。后面再查下。。。

謝謝反饋,這是很有幫助的信息。clangd的人在補全方面投入很多。 我自己的使用習慣是一般會輸入三四個字符才補全,比如:

std::vector<int> a; a.push|

這個時候選擇已經很少了,基本能唯一確定匹配項。在沒有鍵入字符時,我則希望補全列表有規律,比如全部按字典序排序:

std::vector<int> a; a.|

所以你的使用習慣是希望只輸入一、二個字母時能猜測你期望的結果?

比如我输入gr,想要补全graph.clangd会将 gr aph放在第一位.而ccls放在第一位的可能是al g o r ithm

這個例子可能誇張了? ccls/src/messages/textDocument_completion.cc 使用fuzzy_match.cc裏的排序方式。grgraph的相似度肯定比gralgorithm高。不過如果你真的發現問題的話,希望能麻煩你提供更加詳細的reproducer。

多谢大佬,不过公司机器gcc太老。。用的cls总core。。后面再查下。。

你如果在回覆中同時提供發行版和gcc版本信息,也許能得到別人更有針對性的回覆。

比如,如果使用CentOS 7.6 GCC 4.8.5的話,需要 CentOS 7.6 GCC 4.8.5 may need -DCMAKE_CXX_FLAGS=-D_GLIBCXX_USE_CXX11_ABI=0 · Issue #349 · MaskRay/ccls · GitHub 但這也是我覺得提問者做得不夠好的地方。我提問數次他卻始終沒有回答我想瞭解的信息。他有些樓層的comments完全應該放在一個comment中。

儘量不要用GCC<5構建的prebuilt archive (ccls SIGSEGV (due to ABI mismatch) when linking against clang+llvm-[67].0.0-x86_64-linux-gnu-ubuntu-14.04 · Issue #71 · MaskRay/ccls · GitHub)

使用GCC 8.2.1和 releases.llvm.org上下載的prebuilt archives,需要 -DCMAKE_CXX_FLAGS=-fno-gnu-unique (Build · MaskRay/ccls Wiki · GitHub 記錄了)

应该是类似问题,gcc是4.8,我先试试scl看能否解决,主要是网络策略啥的,也都是麻烦事。。。。

确实这样, 可以复现.

输入gr的时候,ccls补全如下图,

输入grap,ccls补全如下图,

g

clangd补全如下图,

2 .

所以我觉的貌似clangd的排序规则要好一点,这个ccls能优化吗

1 个赞

你这个补全,不如加个company-tabine 后端

Spacemacs安装company-tabnine请移步:TabNine太赞了,分享一个Spacemacs配置TabNine Layer的方法 - #3,来自 MatthewZMD

neovim里面用哪个插件配合ccls比较好?目前用的ALE,但是不如spacemacs高亮那么丰富,也不会在变量、函数等上面显示各种有用信息。

很可能我不太会用ALE。。。

無法重現。

git clone https://github.com/paopaol/algorithm --recursive
cmake -GNinja -H. -BDebug -DCMAKE_BUILD_TYPE=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS=on
ln -s Debug/compile_commands.json
ninja -C Debug

graph是第一個:

[pid 34582] write(1, "Content-Length: 31649\r\n\r\n{\"jsonrpc\":\"2.0\",\"id\":8285,\"result\":{\"isIncomplete\":true,\"items\":[{\"label\":\"graph : algorithm::BreadthFirstSearch::Graph\",\"kind\":6,\"detail\":\"\",\"sortText\":\"   !\",\"filterText\":\"graph\",\"insertTextFormat\":1,\"textEdit\":{\"range\":{\"start\":{\"line\":13,\"

想要補全出GTEST_R*的話,鍵入GR,而不是gr。我也不喜歡clangd補全出std::gr*的行爲,這些補全項應該在鍵入std::gr後獲得。

coc.nvim coc.nvim · MaskRay/ccls Wiki · GitHub

我沒怎麼用過ALE,不知道現在發展得怎麼樣了。

1 个赞

奇怪了啊,我的怎么跟你的结果不一样呢。我是windows,莫非跟我emacs配置有关系吗

可能是company-mode的某些排序插件導致的

刚转到 ccls,原因是 eglot+cquery 的组合终于不能用了。

不过我发现了个问题。cquery 搜索 compilation database 文件会考虑 build/compile_commands.json,而 ccls 和 clangd 都只考虑父目录。。。