emacs ccls不能智能提示c++11的auto关键字

现在用的ccls来建c++的索引,不支持auto关键字的语法,你们平常开发使用什么插件来支持auto关键字的提示呢? 其它建index缓存和常见的补全都没有问题,就是c++11的auto定义的变量,变量下面的函数无法自动补全

能提示没问题的。不过其实没get到你的需求。你是要自动补全auto这个词儿?有等的时间都敲完了。。

不是补全auto这几个字母,是auto定义的变量,在后面用时想提示这个变量内部的一些其它信息时完全没反应呢,需要什么特殊的配置吗

那就是project没有setup好。你是照着大神Wiki的哪种方式搭的?

感谢回答哈,你使用时auto的补全没问题是吧?那我仔细对着这个看缺少哪些信息呢

ccls没有问题的。和auto不auto什么的没有关系。

不过在我这是真不行哈,有点无奈

你照着Wiki检查一下,要是还不行就再PO一些细节吧。

Emacs 26.3 (x86_64-apple-darwin18.2.0) of 2019-09-02 on builder10-14.porkrind.org Company 0.9.12

company-backends: (company-lsp company-bbdb company-eclim company-clang company-xcode company-cmake company-files (company-dabbrev-code company-gtags company-etags company-keywords) company-oddmuse company-dabbrev)

Used backend: company-lsp Major mode: c+±mode Prefix: “” Completions: #(“B : auto &” 0 10 (lsp-completion-prefix “” lsp-completion-item #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8125 data (“label” “B : auto &” “kind” 6 “detail” “” “sortText” " !" “filterText” “B” “insertTextFormat” 1 “textEdit” #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8125 data (“range” #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8125 data (“start” #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8125 data (“line” 54 “character” 4)) “end” #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8125 data (“line” 54 “character” 4)))) “newText” “B”)))))) " (Variable)"

example: for (auto &B : MF) { // B.begin不会自动列出begin函数 for (auto I = B.begin(); I != B.end(); I++) {

} }

项目根目录下.ccls %compile_commands.json %c -std=c11 %cpp -std=c++11

ccls 的配置是怎样的?

一般只要存在 compile_commands.json 文件,ccls 会自动感知到的

(require 'lsp-clients) (use-package lsp-mode :commands lsp ; :hook ((c-mode c+±mode objc-mode) . lsp) ; :config ; (setq lsp-clients-clangd-args '(“-j=100” “-background-index” “-log=error”)) ; (require 'lsp-clients) ; ; (lsp-clients-register-clangd) ) (use-package lsp-ui :commands lsp-ui-mode) (use-package company-lsp :commands company-lsp)

(use-package ccls :hook ((c-mode c+±mode objc-mode cuda-mode) . (lambda () (require 'ccls) (lsp))))

(use-package ccls) (setq ccls-executable “/usr/local/bin/ccls”)

compile_commands.json片段: { “directory”: “clion_build/cmake-build-debug/unittests/Support”, “command”: “/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ 省略。。。GlobPatternTest.cpp”, “file”: “/Users/master/llvm/unittests/Support/GlobPatternTest.cpp” },

不知道你要的ccls配置是这个吗?建缓存和其它的自动补全都没有问题,就是auto这种变量无法自动补全也是挺怪的

好歹格式化一下呀,还差个 ccls 的版本

应该是你ccls设置问题,我这里都没问题

Sanity check: 你的 compile_commands.json 是在项目根目录下面吧?

另外,你能PO一下一个简化的json文件吗?把里面内容的文件删到就剩一个文件给我们看看。你之前PO的连格式都没有,也太草率了吧

新建的简单的项目确实能识别,使用的同样的ccls配置,在llvm大项目中竟然不行?

不好意思,compile_commands.json是其它目录软链接过来

[
{
  "directory": "/Users/master/source/clion_build/cmake-build-debug/lib/Demangle",
  "command": "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++  -DGTEST_HAS_RTTI=0 -D_DEBUG -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/Users/master/source/clion_build/cmake-build-debug/lib/Demangle -I/Users/master/source/llvm/lib/Demangle -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/libxml2 -I/Users/master/source/clion_build/cmake-build-debug/include -I/Users/master/source/llvm/include   -fPIC -fvisibility-inlines-hidden -Werror=date-time -Werror=unguarded-availability-new -std=c++11 -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wstring-conversion -g -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk    -fno-exceptions -fno-rtti -o CMakeFiles/LLVMDemangle.dir/ItaniumDemangle.cpp.o -c /Users/master/source/llvm/lib/Demangle/ItaniumDemangle.cpp",
  "file": "/Users/master/source/llvm/lib/Demangle/ItaniumDemangle.cpp"
}
]

# 再补个有问题的文件
[{

 "directory":
 "/Users/master/source/clion_build/cmake-build-debug/lib/Target/AArch64",


 "command":
 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++

  -DGTEST_HAS_RTTI=0
  -D_DEBUG
  -D__STDC_CONSTANT_MACROS
  -D__STDC_FORMAT_MACROS
  -D__STDC_LIMIT_MACROS
  -I/Users/master/source/clion_build/cmake-build-debug/lib/Target/AArch64
  -I/Users/master/source/llvm/lib/Target/AArch64
  -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/libxml2
  -I/Users/master/source/clion_build/cmake-build-debug/include
  -I/Users/master/source/llvm/include


  -fPIC
  -fvisibility-inlines-hidden
  -Werror=date-time
  -Werror=unguarded-availability-new
  -std=c++11
  -Wall
  -Wextra
  -Wno-unused-parameter
  -Wwrite-strings
  -Wcast-qual
  -Wmissing-field-initializers
  -pedantic
  -Wno-long-long
  -Wimplicit-fallthrough
  -Wcovered-switch-default
  -Wno-noexcept-type
  -Wnon-virtual-dtor
  -Wdelete-non-virtual-dtor
  -Wstring-conversion
  -g
  -isysroot
  /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk
  -fno-exceptions
  -fno-rtti
  -o
  CMakeFiles/LLVMAArch64CodeGen.dir/AArch64Subtarget.cpp.o
  -c
  /Users/master/source/llvm/lib/Target/AArch64/AArch64Subtarget.cpp",

 "file":
 "/Users/master/source/llvm/lib/Target/AArch64/AArch64Subtarget.cpp"
}]
.
├── compile_commands.json -> source/clion_build/cmake-build-debug/compile_commands.json
└── source
    ├── clion_build
    │   ├── cmake-build-debug          // cmake编译目录,compile_commands.json文件目录 
            ├── compile_commands.json
    │   └── cmake-build-release
    ├── llvm                           // llvm源码目录
    │   ├── CMakeLists.txt
    │   ├── CODE_OWNERS.TXT
    	├── Driver.cpp
    	├── ....
$ccls --version
ccls version <unknown>
clang version 9.0.0 (tags/RELEASE_900/final)

倒是有一种可能,我也在大项目(OpenCV)里遇见过不正常的情况。我当时是一个一个头文件检查哪里flycheck给了红线。。有的时候这问题不好解 :sweat_smile: (后来因为不影响我当时的流程就没深究再去提Issue求助大神)

没有其它解决办法吗,这个感觉影响体验

不好说。我之前觉得我碰见的那个问题不好解,是因为有些头文件需要在别的文件的特定地方 #include 才能编译。像这样:

// a.hpp

struct Foo {};

#include "b.hpp"
// b.hpp
void bar(std::vector<Foo> v);

假如说ccls单独处理 b.hpp,就会奇怪 Foo TM是从哪来的,可能就会产生影响,虽然整个工程能编译是没错。


注: 以上例子是我瞎编的,但我真TM见到了类似的代码。我无力吐槽代码为什么要这样子写,但我当时怀疑这是导致补全不正常的原因。

当然我完全不知道ccls的内部机理,所以我说的话有多少credibility实在是那啥。。。 :dog:

我觉得你要是能定位到问题在哪儿,可以尝试@一下大神本尊帮你瞅一瞅。

1 个赞