Citre: 先进的 Ctags 前端

赞!提个意见,最好是像陈斌大神的counsel-etags那样,自动生成tags。可以加几个local variable来指定项目的语言,这样生成一个通用的cmd

如果需要根据工程来定制,.dir-locals.el应该可以吧。我使用ctags的经验有限,但感觉上这部分不需要弄得太复杂。

嗯嗯,多谢!那我暂时来利用citre 作为查看代码的工具。

嗯嗯,多谢啦!我在macOS下,其实也是有这个问题。但是修改名字后,就没事了。

我刚才折腾了一下,可以这样设置:

(setq company-backends '((company-tabnine company-dabbrev company-keywords company-files company-capf)))

这样做的技巧:

  1. 把 company-capf 放后端的最后一个,避免他的输出影响其他后端的输出
  2. company-tab 可以利用LSP后端

这样设置可以同时补全来自LSP(通过tabnine)和citre两个后端的内容。

详细的 company 配置可以查看 lazycat-emacs/init-company-mode.el at 8f3dee8a6fe724ec52cd2b17155cfc2cefc8066b · manateelazycat/lazycat-emacs · GitHub

2 个赞

capf 后端的接口比较简单,我感觉完全可以包装一个「依次尝试 LSP 和 Citre 的 capf 函数」的后端。

我比较懒,刚才折腾了一下优先级, tabnine可以补全LSP代码的话,我就不用研究怎么写一个 mix company backend 的函数了。

company 好像有 mix 后端的功能吧,我记得叫group,不过前提是两个不同的后端。

LSP 和 Citre 都是用的 company-capf 这个后端

@kinono 写了一篇文章 Emacs + Company-Mode 配置多个补全后端 帮忙推广 Citre

3 个赞

多谢懒猫大神的指导,我学习下~ 我能理解为,这里面是通过tabnine来实现lsp 与citre 补全的分离么?还是单纯把company-capf 放在所有company 后面就OK? 抱歉,我对company没有啥理解。我尝试就放在最后,补全和我之前没有什么区别(其实我也没别出来哪些是lsp的补全,哪些是citre的)。。。

之后我研究下 lsp-mode 然后写个 wiki 吧。

1 个赞

就看我上面的文章吧 Emacs + Company-Mode 配置多个补全后端

LSP是通过TabNine来的,因为TabNine不走 company-capf 所以可以做到和 Citre 分离

1 个赞

嗯嗯,多谢~ 已经在阅读,并且安装上了tabnine体验看看。

太好了!紫薯布丁

@kinono citre-jump 这个命令可以兼容一下 xref, 当找不到tagsfile或者Ctags没有定义的时候,调用 (xref-find-definitions (symbol-at-point)) 做一个fallback方案,这样就不用设置跳转后端的选项了。

这种情况,对于Elisp这种内置支持,或者Xref后端配置好的情况下,可以兼顾Ctags定义和Xref定义。

本来准备给你写一个补丁的, 发现你是在 citre-get-definitions 里面判断tagsfile, 怕给你弄乱逻辑,所以提一个建议吧,希望采纳。

这个还是自己包一个命令吧,先调 citre-jump,抓到错误以后就调用 xref。

看到这个citre-peek我又想用emacs写代码了

1 个赞

也是个法,分享下我的方案吧:

(defun citre-jump+ ()
  (interactive)
  (if (ignore-errors (citre-get-definitions))
      (citre-jump)
    (xref-find-definitions (symbol-at-point))))
4 个赞

其实我想的是用 condition-case,你这个要查两次定义 :rofl: 不过你没觉得卡就行(

1 个赞