ccls 0.20190823.3 released

前几天刚编译了一个版本,看来又要更新了.不过我有时候总是遇到头文件里无法补全,但是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 都只考虑父目录。。。

ccls可以自定义compile_commands.json目录

  (setq ccls-initialization-options
        `(:cache (:directory ,(expand-file-name "~/Code/ccls_cache"))
                 :compilationDatabaseDirectory "build"))

嗯,用 eglot 麻烦点,参数是json的。我现在是软连接过去的,省事。

這個是我比較討厭的emacs-cquery改動。不知道爲什麼你們都喜歡用build/…如果你編譯release, debug, asan, 就不能只叫build/了。我一般用Release Debug ASAN等區分。Linux kernel可能會用out.x86_64 out.ppc64le

2 个赞