现在用的ccls来建c++的索引,不支持auto关键字的语法,你们平常开发使用什么插件来支持auto关键字的提示呢? 其它建index缓存和常见的补全都没有问题,就是c++11的auto定义的变量,变量下面的函数无法自动补全
能提示没问题的。不过其实没get到你的需求。你是要自动补全auto这个词儿?有等的时间都敲完了。。
不是补全auto这几个字母,是auto定义的变量,在后面用时想提示这个变量内部的一些其它信息时完全没反应呢,需要什么特殊的配置吗
感谢回答哈,你使用时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 的版本
Sanity check: 你的 compile_commands.json
是在项目根目录下面吧?
另外,你能PO一下一个简化的json文件吗?把里面内容的文件删到就剩一个文件给我们看看。你之前PO的连格式都没有,也太草率了吧
不好意思,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给了红线。。有的时候这问题不好解 (后来因为不影响我当时的流程就没深究再去提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实在是那啥。。。
我觉得你要是能定位到问题在哪儿,可以尝试@一下大神本尊帮你瞅一瞅。