关于cquery对#include的补全

当输入#incl的时候, cquery会列出所有可能的头文件, 太多了, 不好选择. 感觉irony-mode的补全更好用一点, 只给出以下两个选择:

#include ""
#include <>

选择之后, 光标自动放在""或<>之间, 此时再列出可能的头文件, ""最好限定在工程目录内, <>限定在工程目录之外, 这样比较方便.

#include ""不應該補全標準頭文件,合理。我很少用這個功能

只給出

#include ""
#include <>

我覺得不好。#include <>作爲第一個選擇,但其他#include "a.h"頭文件也得補全。還要考慮不支持snippet或支持不完全的編輯器

可以找 Twitter上 https://twitter.com/scturtle

后半部分不太明白,twitter打不开。我的意思是这个过程有两次补全,第一次是

用户选择好之后,光标自动位于“”或者<>之间,同时触发下一次补全,即具体的头文件列表。

不喜欢这个条件判断。可以用这个:

https://github.com/cquery-project/cquery/wiki/Emacs#completion

Type #i" (or #include ") for quote-style includes and #i< (or #include <) for system headers.

习惯了irony的这种方式, 有时间自己参考irony修改一下

jacobdufault把我的修改revert了,现在是#foo补全#include "foo.h"了(古怪)

原因应该是一样的: 从#inc一直写到"foo.h 太麻烦了.

他这样相当于只输入关键部分, 效率也挺高, 不过不够自然, 除非补全界面可以配合, 比如高亮关键部位.

目前还是感觉irony-mode和company-c-headers的组合体验比较自然, 也会减少候选项的数量, 不至于被长长的候选列表吓到. (在""或<>之间, 输入三个字符才会触发补全, 所以候选列表不会很长)

单从体验角度,我也比较赞同楼主的看法。

一开始就列出所有补全项目,某种程度也带来一定困扰。还没输入任何实质的关键字(文件名),就已经出现候选项了:

#inc|
 +--^---------------------------------------+
 | #include <any>              any (Module) |
 | #include <ios>              ios (Module) |
 | #include <map>              map (Module) |
 | #include <new>              new (Module) |
 | #include <set>              set (Module) |
 | #include <list>            list (Module) |
 | #include <aio.h>          aio.h (Module) |
 | #include <array>          array (Module) |
 | #include <cfenv>          cfenv (Module) |
 | #include <cmath>          cmath (Module) |
 | ...                                      |
 +------------------------------------------+

接着连续输入比较长的一串字符,才能把候选范围缩小:

#incstdio|
 +-------^----------------------------------+
 | #include <stdio.h>      stdio.h (Module) |
 | #include <cstdio>        cstdio (Module) |
 | ...                                      |
 +------------------------------------------+

incstdio 这一串混合内容(关键+文件名)在输入的当下也会带来一点点视觉上的负担,就像在手机上用笔画输入(一丨丿丶𠄎),有时候会搞不清楚当前输到第几画了。如果关键字和文件名分开补全,直觉上会清晰一点。

还有一种情况:头文件名字很简短,#inc 之后立刻跳到 “#include <|>” 手打文件名可能比补全还要顺手一些。


现在 #foo 补全 #include "foo.h" 因该是 jacobdufault 也感觉到有必要做些改进。

现在 #foo 补全 #include “foo.h” 因该是 jacobdufault 也感觉到有必要做些改进。

他就是这么想的。还因此revert了我把补全正常化的commit。可以去 cquery-project/cquery 提issue

jacobdufau+| @MaskRay #foo is broken

jacobdufau+| which should expand to #include "foo.h"

bstaletic | That’s not an obvious feature.

jacobdufau+| cquery has lots of non-obvious features

他前天发动戊戌政变把我从Owner改成Member我就不想多理会他了。如果不是 emacs-cquery aur/cquery freebsd port spacemacs 这些我都好不容易弄起来的,我毫不犹豫fork的。

gitter | [Github] MaskRay was edited to cquery-project/cquery https://github.com/MaskRay

jacobdufau+| FYI: I’ve changed the github permissions model so we do a PR-style workflow

jacobdufau+| I sincerely hope you continue to contribute, it would be a very sad loss if you decide

      | not to. I'm very happy to talk about different working styles if you think a different

       | approach will work better

像表示怜悯一样

我指出他几个月不作为

2 个赞

这样看来language server自己也需要一些定制, 可以引入个高级一点的配置文件, 或者支持lua, 每个人可以定制不同的风格.

他说的这种流程倒是更合理一点, 这样一个人更容易把握整体走向和风格, 这种模式下, 每个PR他会仔细检查并认真考虑, 可以理解, 不少成功的项目好像都是这样, 除非超级大的项目.

以快乐为主, 不要想太多.

希望irony-mode的作者也能加入进来.

很多成功的项目都不只一个人在看。但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