这个citre-enable-capf-integration已经是t了,但是citre的补全还是独立的显示,并没有和其他的补全一起出现;查看Messagebuffer里有一个错误,error in process sentinel: No catch for tag: citre-done, t 不知道什么意思?
我没有用过 corfu,你的描述大部分我也看得不是很懂(什么是「其他的补全」?)。如果是使用 corfu 之后引起的问题,之后我会试一下用 corfu。
error in process sentinel: No catch for tag: citre-done, t
Citre 为了让补全不卡手,是设计成接受到用户输入就打断 readtags 进程的,这部分代码极其 hack,是有可能出现这个错误的,只不过用 company 的时候从未出现过。我一直想换种方法实现。
我在corfu里同时还配置了cape,tabnine的补全,但是citre只会显示出tags的补全,其他的都没有了,所以才怀疑是不是citre没有用corfu的后端;在company下citre的补全结果和其他后端的结果是可以一起出现的。 确实在company下没有见过这个错误;
corfu 直接使用的 capf, 这个报错可能是 capf 产生的,我在 windows 下面老遇到。没仔细研究代码,直接把 capf integration 关了。
可以试试这个函数 「cape-capf-buster 」GitHub - minad/cape: 🦸cape.el - Completion At Point Extensions
类似这种
(setq-local completion-at-point-functions (list (cape-capf-buster #'citre-completion-at-point)))
或者融合一下,参考 https://github.com/theFool32/.emacs.d/blob/master/elisp/init-complete.el#L202=
我目前在修 No catch for tag
的那个错误。我使用 Corfu 以后并没有复现,因为手上没有大的 tags 文件,也没有 Windows 可以用,无法做进一步的测试。现在猜测着修了一下,可否请你帮忙测试?
- 正常启动 Emacs、Citre 和 Cofru
- 把 这个文件的内容复制到一个 buffer 里,并且
M-x eval-buffer
- 在出现问题的文件中尝试补全,看看有没有修复
另外,关于和其他 capf 后端联合使用的问题,这个要求 capf 后端是 “non-exclusive” 的,但 Emacs 目前对这个的支持有 bug,见 completion--capf-wrapper
中的注释:
;; FIXME: Here we'd need to decide whether there are valid completions against
;; the current text. But this depends on the actual completion UI (e.g. with
;; the default completion it depends on completion-style) ;-( We approximate
;; this result by checking whether prefix completion might work, which means
;; that non-prefix completion will not work (or not right) for completion
;; functions that are non-exclusive.
因为 Citre 支持 substring completion(见 citre-capf-substr-completion
),这个 bug 会影响 Citre,所以 Citre 的 capf 后端做成 exclusive 的了,也就是说如果 Citre 提供了结果,Emacs 就不会继续问后续的补全后端要结果。
但是 Corfu 有一个 advice 修了这个问题,见 corfu-mode
的注释:
;; FIXME: Install advice which fixes `completion--capf-wrapper', such that it
;; respects the completion styles for non-exclusive capfs. See FIXME in the
;; `completion--capf-wrapper' function in minibuffer.el, where the issue has
;; been mentioned. We never uninstall this advice since the advice is active
;; *globally*.
所以如果把 Citre 的后端做成 non-exclusive 的(很简单,一行代码的事),在 corfu 里是可以正常使用的,但我需要评估一下要不要这么修,毕竟也有很多用户不用 corfu 的。
一个简单的做法是把 citre-completion-at-point
放在 completion-at-point-functions
里面其他 non-exclusive 后端的后面,这样就不影响了。我看了下 cape 里面大多数或者全部后端应该都是 non-exclusive 的。
顺便其实我之前也交过一个补丁修正这个问题(https://debbugs.gnu.org/cgi/bugreport.cgi?bug=39600),和 corfu 做的事情差不多,不过维护者觉得这个修法不对
我用corfu主要是想用lsp-bridge,但是也没有成功,看起来好多包在windows下确实问题挺多的,暂时全部回滚到company了,现在没有corfu的环境了。
我测了,没有 No catch for tag 的错误了,不过敲字卡卡的。。。
谢谢。那还是等我能用 Windows 以后自己翻修一下吧 尽量这周之内
@haoisli9 @smallzhan 我已经在 Windows 上修复了 “No catch for tag” 的问题(PR 在这里),company 和 corfu 都在大的 tags 文件上测试过,在我这里不卡手,但我想请你们也测试一下,确认没问题的话再合并。
请使用 async 分支。比较简单的办法是:
- 打开 Emacs,正常加载 Citre。
- 分别打开链接中的
citre-common.el
、citre-core.el
和citre-basic-tools.el
,点击 “raw” 按钮,全选后将文件内容粘贴到 Emacs 的空 buffer 里面并eval-buffer
。 - 测试补全有无问题,是否卡手。
谢谢!
今天在windows下安装你的要求测试了一下,感觉好像和原先没有太大差别;项目不大,不知道是否可以反应真实情况;
谢谢,请问您说的「和原先没有太大差别」是使用体验恢复正常了的意思吗?是否是用 corfu 测试的呢?
我试了试 async 分支,光论 tag 补全感觉可以了,corfu 体验基本正常了,也没有 No catch for tag 的错误了。 不过他会抢 corfu 里面其他的补全,例如我用的 lsp-bridge 时,会先出来 lsp-bridge 的补全, 一会就被 citre给抢了。
谢谢,那我先合并了。后面这个不好说是哪边的问题呀,想知道是任何其他 capf 后端位于 citre 前面都会被 citre 抢,还是只有 lsp-bridge 有这个问题呢?
我换了 eglot 之后 citre 的 completion 根本不出来,看了下 citre 的 capf 排在 eglot 后面。lsp-bridge 确实比较特殊,不是传统的 capf 用法。
不过我是一般关了 capf 用的。citre 主要用于跳转,偶尔 peek 下。
我看了下 eglot 的代码,它应该也是 exclusive 的,如果有结果的话就不会让后面的后端起作用了。
如果要 hack 一下的话可以在 eglot-completion-at-point
上加个 advice,在返回时后面 append :exclusive 'no
。
大佬,我在使用的时候,发现用 citre-edit-tags-file-recipe 或者 citre-update-tags-file 重新设置命令参数后,更新 tags,怎么会更新好几遍呢?
就是 我在ps -ef,中观察 先是运行 ctags …,然后是 sort …完了之后又这样的操作,重复 3,4遍才完成。 如果是 citre-update-this-tags-file 就直接一遍。不知道是为什么?(偶尔出现,不是必现)
第二点 能不能在 update tags的时候,先 创建一个临时文件,更新完成后再 替换掉 旧的tags文件,这样可以保证 我update tags的时候也可以使用 citre.
重新设置命令参数后,更新 tags… 先是运行 ctags …,然后是 sort …完了之后又这样的操作,重复 3,4遍才完成。 如果是 citre-update-this-tags-file 就直接一遍。
这个我也不是很清楚,但应该不是 Citre 的锅。Citre 只会运行一次 ctags,你观察到的现象可能是 ctags 在给 tags 文件做排序。
能不能在 update tags的时候,先 创建一个临时文件,更新完成后再 替换掉 旧的tags文件
听上去好像也算有用,不过我直觉会引入各种问题… 更新 tags 文件有很多做法,不一定要打开 Emacs 用一个命令更新。Universal Ctags 的作者自己就是用定时任务运行 ctags 命令来更新内核的 tags 文件的,对大工程来说我觉得这种办法更适合。此外如果有记录 search pattern(不使用 -n
)选项,不做大范围改动的话也不影响跳转的准确性。
目前我想对R语言增加一个这样子的tag规则 不知道具体该怎样写 我仿照着您的php的例子写了一个正则 但是似乎失败了 目标就是能够把 column._names
给tag出来
data._frame$column._names <- "something"
目前想对这样子的代码进行一个tagging,因为r语言的变量名里面既可以包含 .
也可以包含_
,同时赋值符号既可以是等于号也可以是箭头,所以规则写起来要复杂一些,目前我先考虑仅实现箭头的版本
目前我写的规则是这样子的 然后发现失败了。
--langdef=Rext{base=R}
--kinddef-Rext=m,membership,name attributes in data frames
--regex-Rext=/[\w\.]+\$([\w\.]+)\s*<-/\1/m/
我的这段regex在regex101网站上测试是可以通过的,可以正常匹配到我想要匹配的字符串。
我生成tags的命令用的是 ctags -f .tags -a --fields='*' xxx.R
也是仿照着您的php用例来的,options.ctags
我也放在了~/.ctags.d/options.ctags
底下