当输入#incl的时候, cquery会列出所有可能的头文件, 太多了, 不好选择. 感觉irony-mode的补全更好用一点, 只给出以下两个选择:
#include ""
#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 brokenjacobdufau+| 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
像表示怜悯一样
我指出他几个月不作为
这样看来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
等