关于cquery对#include的补全

很多成功的项目都不只一个人在看。但spacemacs/radare2/vim都是syl20bnr/pancake/brammool专制统治,(几乎)所有PR都要经过他们。

像spacemacs真是忙不过来了,像 Remove `(add-hook 'c-mode-common-hook 'spacemacs//c-toggle-auto-newline))` from +lang/c-c++/packages.el · Issue #10451 · syl20bnr/spacemacs · GitHub 这种群众一致不同意的特性删除都要拖这么久

我突然想到了Linus

cquery我不懂,但是快速输入#include <|>难道不是yasnippet的事情么。。。补全当然只对stdio.h啊。。

cquery 可以 include 补全一些第三方的头文件包括你自己写的

irony-mode, cquery这些, 会动态生成一些snippet, 不用自己写snippet了, 更方便

我觉得吧,include补全真不如把需要的include打表然后用ivy

我昨天抄了你的defvar +amos/default-include-headers

(defun my/ivy-insert-include ()
  (interactive)
  (ivy-read "#include: "
            (append
             +amos/default-include-headers
             (split-string
;;;;;;;;;;;;; -L ,因爲在某些系統上 /usr/include/sys/ 裏是 symlinks
              (shell-command-to-string "(cd /usr/local/include ; find . -type f ; cd /usr/include ; find -L sys -type f) | sed 's=^./=='")))
            :action #'my//insert-include))

對於std include確實不錯,但對於項目內、或third-party頭文件不方便。

我抄+改的這個 https://github.com/MaskRay/cquery/blob/fuzzy/src/fuzzy_match.cc 比 flx.el 好多了

我每个project都有独立的include list, 开始搞一波就好。 或者cquery来一个dump include list 的feature, 那就更方便拉

emacs-cquery里面有没有可能把include path提取出来呢?

比如irony可以(Issues · randomphrase/company-c-headers · GitHub)

(defun company-c-headers-path-user-irony ()
  "Return the user include paths for the current buffer."
  (when irony-mode
    (irony--extract-user-search-paths irony--compile-options
                                      irony--working-directory)))
(setq company-c-headers-path-user #'company-c-headers-path-user-irony)

这样吧user include path传给company-c-headers,同样的还有system include path。

或者是得到complier options,这样可以把company-irony-c-headers拿过来抄。。。

可以设置initialization options里的extraClangArguments(我很想在自己的fork里改掉这个名字,但还没想好更好的)加上-I -isystem -iquote

你的意思是加上-I这些就可以补全相应的头文件了吗?不过我的意思是通过cquery获得当前文件的编译器参数来获得include path或者直接获得include path。。。

有个函数cquery-file-info,用于获取命令行

cquery-tree.el 里 Unicode+23F7 显示不出来……应该安装什么字体?

获取这些参数后再调用clang或gcc命令(company-c-headers是这样工作的吧?)来获取头文件列表?这样又要依赖clang了,没有充分利用cquery的功能。

如果lsp补全再加一层处理,即cquery提供原始补全列表,然后到emacs这边用lisp做一层处理,然后再显示,这样可定制性就很强。比如include补全,cquery把头文件列表给过来(比如给company-c-headers)。

company-irony-c-headers是这样,company-c-headers的话是直接让用户提供路径列表。。。不过cquery没有对外获取头文件列表的方法的话只有这样啊,而且cquery-file-info的话,不是也包含了用的哪个编译器吗,主流编译器都可以通过-xc/c++ -E -v -来输出路径吧,不支持的也就算了。。。

src/messages/cquery_wait.cc notification,这个操作是阻塞的,执行后不能处理其他请求(我怀疑还有其他问题,所以自己的fork就删除了这个方法)

你去提issue吧。我觉得他们可能的解决方案是碰到wait请求就创建detached std::thread,阻塞到结束。

这类操作已经是数据库范畴了……

#include 如果可以弹出一个窗口根据要使用的函数来选择头文件,就很爽了.

毕竟包含头文件的目的并不是文件本身,而是函数.

這個應該結合 global completion,然後用 textDocument/codeAction (可能)自動產生#include