emacs-cquery 成立,呼籲spacemacs支持LSP、集成cquery到c-c++ layer

cquery 作者創建了 organization

我就開心地建立 GitHub - cquery-project/emacs-cquery: Emacs client for cquery, a low-latency language server supporting multi-million line C++ code-bases 了~從 cquery 裏把 emacs/cquery.el 抽出來

% cd cquery
% git filter-branch --prune-empty --subdirectory-filter emacs -- --all
# .git 依然很大,怎麼縮小呢

LICENSE 這件事很棘手,大部分代碼是topisani寫的,他想用MIT (應該是指 MIT Expat license 吧)。等到他加了LICENSE,才能扔到 Melpa 去

呼籲 spacemacs 社區支持 LSP、集成cquery到c-c++ layer 的提案 Add ccls/cquery (language server) to c-c++ layer · Issue #10134 · syl20bnr/spacemacs · GitHub 希望 lsp-mode lsp-ui 能進 spacemacs。spacemacs 最近有些改進 c-c++ layer 的行動,syl20bnr 弄的 c-c+±enable-rtags-support 把大家弄壞了。感覺得快點發 issue 引起他們對 LSP 的重視

3 个赞

路过踩踩
目前体验上感觉还不是太好,观望中

有哪些問題?

M-x checkdoc 好煩啊……怎麼辦

% du -sh .vscode/cquery_cached_index 
96M     .vscode/cquery_cached_index
ray @ hacking >>= ~/Dev/Bin/radare2 
% du -sh ~/.cache/rtags/_home_ray_Dev_Bin_radare2_
600M    /home/ray/.cache/rtags/_home_ray_Dev_Bin_radare2_

不用跑到项目目录打tag这点就比其他的工具好了,先观望一下,等进MELPA再装,不过这个clang resource directory指的什么?就是clang执行文件之类的吗?

编译了一下cquery, 依赖的东西有点多, rapidjson, loguru, sparsepp等, 有编译好的最好

這些是 clang resource directory 裏的東西,包括重要的 stddef.h stdint.h 等。可以當作 -internal-system 頭文件。 resource dir 是自動檢測的,不需要設置 cquery-resource-dir

% tree
.
├── asan_blacklist.txt
├── cfi_blacklist.txt
├── dfsan_abilist.txt
├── include
│   ├── adxintrin.h
│   ├── altivec.h
│   ├── ammintrin.h
│   ├── arm_acle.h
│   ├── armintr.h
│   ├── arm_neon.h
│   ├── avx2intrin.h
│   ├── avx512bwintrin.h
│   ├── avx512cdintrin.h
│   ├── avx512dqintrin.h
│   ├── avx512erintrin.h
│   ├── avx512fintrin.h
│   ├── avx512ifmaintrin.h
│   ├── avx512ifmavlintrin.h
│   ├── avx512pfintrin.h
│   ├── avx512vbmiintrin.h
│   ├── avx512vbmivlintrin.h
│   ├── avx512vlbwintrin.h
│   ├── avx512vlcdintrin.h
│   ├── avx512vldqintrin.h
│   ├── avx512vlintrin.h
│   ├── avx512vpopcntdqintrin.h
│   ├── avxintrin.h
│   ├── bmi2intrin.h
│   ├── bmiintrin.h
│   ├── __clang_cuda_builtin_vars.h

没用过lsp-mode,按着wiki1.2.3.4.5.步安装了lsp-modecquery,设置了cquery-executable.cquery,然后开了lsp-cquery-mode

但是在M-x lsp-capabilities说这个buffer没有关联lsp,还需要设置什么吗?

解决了

整理了一下.emacs。。。

不过我用了下面这个后还要手动开一次


(defun my//enable-cquery-if-compile-commands-json ()
  (when
      (or (locate-dominating-file default-directory "compile_commands.json")
          (locate-dominating-file default-directory ".cquery"))
    (lsp-cquery-enable)))
(my//enable-cquery-if-compile-commands-json)

今天试了一下 pr 中的 lsp layer 和 cquery layer 的代码,但是发现有一下错误

File mode specification error: (file-error Writing to process Bad file descriptor lsp-cquery)
Error running timer ‘lsp-ui-sideline--run’: (wrong-type-argument hash-table-p nil)

为了不拖慢你的 pr 成功合并时间,我就不在 pr 下讨论了


详情

system info

System Info :computer:

  • OS: darwin
  • Emacs: 26.0.91
  • Spacemacs: 0.300.0
  • Graphic display: t
  • Distribution: memacs
  • Editing style: hybrid
  • Completion: ivy
  • Layers:
((auto-completion :variables auto-completion-enable-sort-by-usage t auto-completion-return-key-behavior 'complete auto-completion-tab-key-behavior 'complete auto-completion-enable-snippets-in-popup t auto-completion-idle-delay 0.6 auto-completion-private-snippets-directory "~/.emacs.d/snippets/")
 git
 (syntax-checking :variables syntax-checking-enable-by-default nil)
 markdown protobuf docker
 (ranger :variables ranger-show-preview t)
 (org :variables org-startup-indented t org-enable-github-support t)
 lsp lsp-python cquery emacs-lisp html
 (latex :variables latex-build-command "LatexMk" latex-enable-folding t)
 shell-scripts
 (python :variables python-enable-yapf-format-on-save t python-test-runner 'pytest)
 javascript
 (c-c++ :variables c-c++-enable-clang-support t)
 sql yaml
 (go :variables gofmt-command "goimports")
 mp-org mp-hacking)
  • System configuration features: JPEG RSVG IMAGEMAGICK NOTIFY ACL GNUTLS LIBXML2 ZLIB TOOLKIT_SCROLL_BARS NS MODULES LCMS2

memacs 即 spacemacs-base

Inited

  • 已编译安装 cquery
  • 已设置正确的 cquery-executable
  • 在一个c的项目目录下创建 .cquery :
# Driver
gcc

# Language
-xc

.cquery 为空文件时, 同样具有这个错误。

exclusion

我使用 lsp layer 和 lsp-python layer 时能够如期运行,所以我觉得问题不在 lsp layer

error: (file-error Writing to process Bad file descriptor lsp-cquery) 應該是 cquery-executable 進程退出了

  • pgrep -af cquery
  • (setq cquery-extra-args '("--log-file=/tmp/cq.log"))/tmp/cq.log

我发现问题所在了…

我这个版本的 cquery 需要 --language-server 参数启动。

而 cquery 包中运行 cquery 的方式是 (,cquery-executable ,@cquery-extra-args) , 这个 cquery-extra-args 默认为 nil。

image

所以加一个 --language-server 进去就对了 。


我不知道将来 cquery 包会不会默认添加这种参数。

你用的是 Releases · jacobdufault/cquery · GitHub 预编译版本吗?我最近把 --language-server 删除了,也从 cquery.el 中删除了

我用的是 2018.1.23 的 releases 版本, master 分支的版本我编译失败,有以下错误

image


顺便提一下, release 版本的 Source Code 竟然没有把相应的 submodule 包含进去,导致只能手动根据 .gitmodules 克隆第三方包。

没有了 submodules, 打包好的 releases 源码如何获取 third_party?

手动克隆 :joy:,它 .gitmodules 还是有的

.gitmodules 文件果然还在,但是没有锁定版本,有可能哪一天就编不过了 @MaskRay

你能調研下 std::string_view(detailed_name.c_str() + short_name_offset, short_name_size); 爲什麼編譯失敗嗎?

這個 third_party/string_view.hpp 是給C++11的polyfill,隨便找的,不一定好用。

releases/ 源碼包是原作者弄的……我可以去提醒一下

不喜歡鎖版本……鎖版本維護更麻煩

release 的时候可以把当前的 third_party 一起打包,就不需要维护了。

要不然过一段时间,想要编译某个版本的 release,而 third_party 最新版有可能做了比较大的变更,导致编译失败。

有沒有人感興趣把 Make lsp-ui-imenu hierarchical · Issue #73 · emacs-lsp/lsp-ui · GitHub 做出來?任意的 symbol hierarchy

  • 遞歸顯示 struct/class 的成員
  • 顯示 call tree
  • 顯示繼承樹(DAG)

T_T