怎样在emacs中完整的使用lsp + ccls

我使用emacs一段时间了,想用lsp+ccls的方式管理工程,工程使用CMake, 有compile_commands.json lsp的配置如下:

(require 'ccls)
(require 'lsp-mode)
(add-hook 'c++-mode-hook #'lsp)
(add-hook 'c-mode-hook #'lsp)
(add-hook 'objc-mode-hook #'lsp)
(add-hook 'python-mode-hook #'lsp)

;;;
;;(use-package lsp-mode
;;  :commands lsp
;;  :init
;;  (setq lsp-auto-guess-root t)
;;  :config
;;  (require 'lsp-clients)
;;  )
;;;
(setq ccls-executable "~/ccls/Release/ccls")
(setq ccls-args '("--log-file=/tmp/ccls.log"))
 
(setq lsp-prefer-flymake nil)
(setq-default flycheck-disabled-checkers '(c/c++-clang c/c++-cppcheck c/c++-gcc))

(require 'company-lsp)
(push 'company-lsp company-backends)

;;(require 'lsp-ui)
;;(add-hook 'lsp-mode-hook 'lsp-ui-mode)

;;(use-package lsp-mode
;;  :commands lsp
;;  :hook ((c-mode c++-mode objc-mode) . lsp))

工程根目录中还有 .ccls %clang%lsp --std=gnu++14 -isystem/ust/include %h -x c+±header 这个配置看网络的,不知道这个文件编写有什么规则

现在的情况是 我的工程中所有的头文件都是问题:ccls:unknown type name ‘xxxx’

有哪位大神指导一下,我该怎么完整正确的配置 lsp ccls 还有 compile_commands.json文件怎样才能让ccls用上? 现在我非常没有头绪

放到指定目录下就行了。看文档

在运行cmake的命令行里加一个参数

-DCMAKE_EXPORT_COMPILE_COMMANDS=1

运行cmake以后会在运行cmake的目录下产生一个compile_commands.json,把这个文件链接到你的项目根目录下即可,ccls会自动找到这个文件并使用的。

还要创建使用ccls --index生成.ccls-cache的文件夹

不需要,ccls会自动建立cache文件夹

其实这些我都做过了,现在我发现可能是 .h 的头文件没有被识别为C++的头文件,才导致了一大堆的错误。但是我已经在 .ccls 加入了 %h -x %h c+±header ccls.log文件有这一条:

22:42:40 ccls              project.cc:284 I use /home/sky/Example/.ccls: %compile_commands.json %h -x %h c++-header %c -std=c11 %cpp -std=c++14 -Iinc -DMACRO

我是不是有必要把整个的ccls.log文件上传

怎样做才是正确的让ccls 把.h识别为c++的头文件? 在一个头文件中ccls有如下错误: ccls: expected ‘;’ after top level declartor[4] ccls:unkonwn type name ‘class’ [2]

跟这没关系吧,只需要把json文件放到指定目录就行了,ccls有文档说明啊,默认是项目根目录,有了json文件,.ccls就没有存在的必要了

可是我这里一直提示 ccls: use of undeclared identifer ‘std’

看ccls的wiki,一般用symbolic link

compilationDatabaseDirectory,把这个配置上就行了

我遇到的更奇葩,一直以为功能都正常,直到有一天打开std=c++17,然后include ,这个std::any就死活识别不了

然而M-.是能打开any头文件的

我也遇到这个问题,很诡异 我在.ccls里已经设置好,但是仍无法正确切换到C++17的标准

clang
%c -std=c11
%cpp -std=c++17
%h -x
%h c++-header

我的.ccls和你的一样 但是我发现因为我的头文件里有C++ 的类和C的结构体类型的时候,所有的类型都会报错, 并且都是ccls:unknow type name ‘xxxxx’, 但是当我把 __cplusplus的判断写在文件前面,就没有错误了

#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif

但是每个文件都加这一段,显然不是个好方法,根本问题还是没有很好兼容C/C++代码导致的问题,是不是在配置上可以解决,还是在CMake的代码里有解决的办法