幫忙改進 C++ LSP 體驗

emacs 26 一直到 pretest 1 都还有问题,建议直接 emacs 27。

EMACS25.3.1不行吗?cquery也没有对emacs版本有要求啊

lsp-ui 中的 chlid-frame 是 Emacs 26 的新功能。

lsp-cquery-enable 一定要在project 目录里的找的 compile_commands.json 或者 .cquery 才会启动 cquery 的server

YouCompleteMe 只針對一個 translation unit,不支持 find references。find definitions 不知到怎麼實現的,理論上如果在其他 .cc 文件是跳轉不了的,但能跳轉到 #include 裏的頭文件,用一些啓發可以找到 .cc

rtags 存儲模型設計得很愚蠢,find references 可以 strace 看它到底要訪問多少文件。

以及 LSP 週邊客戶端都在茁長成長,這兩個的插件系統都是自己一套的,多一份配置

cquery 跟 Emacs 没关系。cquery.el 需要至少 Emacs 25.1,我用 25.3 试过可以正常工作。先把自己操作层面的因素排除掉(特别是 cquery 并非开箱即用的),然后再找外部原因。

感谢大家的回复!

我现在已经将lsp-ui卸载了. 现在的状态是cquery安装好了, 也按照wiki相应地配置了emacs. 也调用了lsp-cquery-enable, 但是不能补全, 而且调用xref-find-xxx之类的命令时, 总是提示visit tags table (default TAGS). 我觉得language server没有正常工作.

是不是还有什么需要特别注意的呢?

server 有没有启动可以用 ps aux | grep <关键字> 查看,提示 visit tags table (default TAGS) 跟 server 无关吧,都 lsp 了应该不需要 TAGS 了,你看下 xref-find-xxx 是不是可以配置不同的来源。

另外 Linux 可以用 forkstat 透過 process events connector 查看進程是否啓動過

M-: xref-backend-functions 看是否(lsp--xref-backend)

對於畫 $cquery/callHierarchyTree ,可以復用 tree-widget.el 或 treemacs 嗎?(感覺我的elisp技藝不夠做這件事:frowning:

昨天我已經改成 編譯cquery時,如果指定的環境變數CXXFLAGS裏沒有-std=設定則默認加-std=c++11 / 默認--bundled-clang=5.0.1(使用系統clang因爲版本問題容易出問題);還有哪些能更加用戶友好(向out-of-the-box方向努力)的方式?

lsp-mode 目前还不能在临时 buffer(包括 *Org Src ... *)中使用吧,必须是打开磁盘上存在的文件,才能补全,我初步测试是这样的,不知是不是漏了什么没有设置?

lsp-methods.el 很多方法會讀 buffer-file-name,必須是磁盤上存在的文件。昨天 @jiegec 有個PR也很有趣 [lsp-ui-peek] Propagate lsp--cur-workspace when jumping to xref and enable lsp-mode when necessary by jiegec · Pull Request #22 · emacs-lsp/lsp-ui · GitHub

不能用在临时 buffer 就不好玩了。

这个 lsp-ui 在终端底下有 bug,输入第一个字的时候忽然跳出个全屏的只读窗口。

提供编译好的包最好

折腾了半天。用bear make产生了个数据库文件。用company capf后端可以进行简单补全。但头文件还是补全不了。可以进行跳转到函数定义。

但还是无法识别make unique之类的语法。而且lsp imenu无法使用。

还请各位大神指点迷津

這個艱難之處在於 bundled clang+llvm 體積很大。只能讓構建方式儘可能簡單來緩解了 PKGBUILD - aur.git - AUR Package Repositories 這個也很簡單了

不是識別不了 make_unique, 而是在 src/indexer.cc ,作者的邏輯是跳轉到 constructor 而不是 make_unique 的 primary template:

      bool is_template = ref->referencedEntity->templateKind !=
                         CXIdxEntityCXXTemplateKind::CXIdxEntity_NonTemplate;
      if (is_template && str_begin("make", ref->referencedEntity->name)) {
        // Try to find the return type of called function. That type will have
        // the constructor function we add a usage to.
        optional<ClangCursor> opt_found_type = FindType(ref->cursor);
        if (opt_found_type) {
          std::string ctor_type_usr =
              opt_found_type->get_referenced().get_usr();
          ClangCursor call_cursor = ref->cursor;

          // Build a type description from the parameters of the call, so we
          // can try to find a constructor with the same type description.
          std::vector<std::string> call_type_desc;
          for (ClangType type : call_cursor.get_type().get_arguments()) {
            std::string type_desc = type.get_spelling();
            if (!type_desc.empty())
              call_type_desc.push_back(type_desc);
          }

M-: imenu-create-index-function => lsp–imenu-create-index ?我現在用的更多的是 lsp-ui-workspace-symbol

感谢大神的回复!

  • make_unique<…>和make_shared<…>之类的问题只能等作者更新了吧?
  • 关于imenu. 运行M-: imenu-create-index-function 返回的结果为 imenu-default-create-index-function. 我在~/.emacs.d/init.el中设置(setq imenu-create-index-function 'lsp-imenu-create-index)不起作用. 当打开一个c++源文件, M-:(setq imenu-create-index-function 'lsp-imenu-create-index)后运行imenu报错imenu–make-index-alist: Symbol’s function definition is void: lsp-imenu-create-index
  • 另外, 我发现用company补全的时候(用的后端是company-capf, 没有装company-lsp), 选中候选的时候, 直接在源文件中插入的字符串中还包含${1} … ${0}之类的, 光标没有自动跳转并选中这些占位符.是compan的问题吗啊?

(lsp-enable-imenu) 開啓imenu

https://github.com/Sarcasm/irony-mode/releases ? 下載好和 git clone 之後編譯體驗相差有多遠?是因爲國內 git clone 慢?

作者推崇mono repo,我看看再推動一下 emacs/cquery.el Melpa 化和 git filter-branch 移除過期的VSCode插件減少.git體積 Create releases · Issue #209 · jacobdufault/cquery · GitHub