lsp 报错 unable to find file

各位大家好,今天按照官方教学下载完cquery后,也依照设定装了lsp跟cquery,也把compile_commands.json放到project的根目录底下,可是打开.cpp文件时报错

Error from the language server, unable to find file XXX/XXX/XXX.cpp (internal error)

可是使用时可以正常的补全也可以做跳转,但就是底下会一直出现找不到档案的错误,请问要怎么解决??

以下为我的相关设定

(use-package company :ensure t :init (global-company-mode))

(use-package company-lsp :ensure t :init (push 'company-lsp company-backends))

(use-package cquery :ensure t :init (setq cquery-executable “/home/jiyeondino/cquery/build/release/bin/cquery”))

(use-package lsp-mode :ensure t :config (lsp-define-stdio-client lsp-prog-major-mode “language-id” (lambda () default-directory) '("/my/lsp/server" “and” “args”)) (add-hook 'prog-major-mode #'lsp-prog-major-mode))

虽然功能用起来都没什么问题,可是底下就是一直会看到错误讯息让强迫症很难受阿

cquery/ccls暫時就是這樣,如果文檔還在索引中,對該文檔的任意請求(會執行FindFileOrFail)都會報錯:

      out.error.code = lsErrorCodes::ServerNotInitialized;
      out.error.message = absolute_path + " is being indexed.";

如果是

    LOG_S(INFO) << "Unable to find file \"" << absolute_path << "\"";

那麼確實是找不到文檔了。使用compile_commands.json的話確保你打開的文檔在裏面,

https://github.com/maskray/ccls/blob/master/src/message_handler.cc#L156

1 个赞

抱歉还是有点不太懂 你说"使用compile_commands.json的话确保你打开的文档在里面",是指说只要我在编辑的档案跟compile_commands.json在同一个资料夹底下就可以了?还是说我必须在compile_commands.json里面再加入某些设定这样server 才可以找到我的档案?

因为我出现的是第二种unable to find file + absolute path的错误,所以应该是真的找不到文档,但是我正在编辑的文件跟compile_commands.json确实有在同一个目录底下(我的compile_commands. json是直接从cquery/build 底下直接复制到我工作的目录底下的),所以是不是我还需要去修改compile_commands.json里面的一些设定才可以让他找到我的档案??

PS: 因为以前没用过这种需要有设定档包含在目录底下的做法,所以很多东西都不是太了解他是怎么运作的

最后发现问题了,在档案目录底下还会有一个.cquery_cache的档案,如果之前有座一些档案更动的话可能会造成unable to find file的问题,将之删除并重启档案应该就没问题了

因爲C/C++檔案需要命令行,compile_commands.json就是告知伺服器調用clangIndex時怎麼編譯各個.c .cc .cpp .cxx檔案的。每個專案都有不同的compile_commands.json,你不能從cquery裏抄一個放到其他地方。https://sarcasm.github.io/notes/dev/compilation-database.html說明了怎麼生成。

.cquery/.ccls是給難以生成compile_commands.json的專案用的,每行一個開關。但壞處是所有檔案統一用相同的命令行開關,有些時候可能不適用。其實cquery/ccls也支持子資料夾的.cquery .ccls,只作用於其中的檔案。

1 个赞

请问如何临时关闭 ccls 呢?我在 emacs 下用 gdb 调试代码时,总弹出这个信息实在太扰民了。