Citre: 先进的 Ctags 前端

其实他的意思应该是给acm这个补全前端加一个后端😂

但是 citre 生成的 tags 文件是在远程主机上的,正常情况下解析工作是不是也应该在远程主机上

不是的,这个流程是在远程用 readtags 过滤 tags 文件,把输出传回本地再解析。解析的部分是 elisp 写的,当然不会在远端执行。

那估计网络传输时间可能占了大头

前些天在tramp上用citre,生成tags文件时(忘记是ctag还是gtag了),把我的整个project一起删了,没有去细追是啥原因,幸亏当时都commit了,没有unstaged change,然后通过repo sync来还原了worktree。

lsp-bridge 已经支持citre做后端补全了

citre mode开启以后,会自动接管 imenu,但是像emacs-lisp之类的mode,使用builtin的imenu会比citre更好用一些。请问如何配置 citre 的 imenu integration

目前想到的就是两种场景:1.在某些场合禁用 citre imenu (如 emacs lisp)2.在某些场合比如开启 lsp 的情况下,eglot 会接管 imenu,但是这个时候我想要把 citre 的 imenu 给加回来。

(setq citre-enable-imenu-integration nil)

不同的模式看能不能使用 mode hook 来配置, 比如你上面那个需求,加到 emacs-lisp-mode-hook 里面。


(defun my-do-not-use-citre-imenu ()
  (setq-local citre-enable-imenu-integration nil))

(add-hook 'org-mode-hook #'my-do-not-use-citre-imenu)
(add-hook 'emacs-lisp-mode-hook #'my-do-not-use-citre-imenu)


感谢!这样子就可以了。 之前没想到原来是否 enable imenu 这种东西也是可以设定为buffer local的。

hi,我想请问一下,citre支持在多个tags里面查找吗?

最近在用citre来查java代码。

我在jdk,spring-boot等几个基础库里面都做了tag。

但是在自己库里面查的时候,想联查jdk和spring-boot等项目。

我知道在每个项目里面都可以用ctags指定目录生成jdk的tag。

但是这样jdk的tag就到处都在生成,空间也浪费了。

能不能我在一个项目里面,设置几个tags,在一个里面找不到就找另一个(jdk)里的tag呢?

目前不支持。我也想做多 tags 文件的支持,但是很多设计问题还没有想明白。

有没有变量什么的让我不管在哪儿都可以从固定的tags里面来peek呢?我试了下面的设置不行:

(defun peng-java-citre-peek ()
  "a wrap for citre-peek for java."
  (interactive)
  (let ((default-directory "~/github/jdk/"))
    (deactivate-mark)
    (ring-insert find-tag-marker-ring (point-marker))
    (citre-peek)))

citre--tags-file

收到,多谢。

如果您有研究出什么比较方便的做法,可以给我参考一下吗?谢谢

噢,这个到没有。我主要是最近要写java。然后有些java自己的定义,库什么的需要查看。

而我想在任意地方,随时想查就查。

然后我根据您提示的 citre--tags-file 定义了这个函数:

(defun peng-java-citre-jump ()
  "a wrap for citre-peek."
  (interactive)
  (let ((citre--tags-file (concat (getenv "HOME") "/github/jdk/.tags")))
    (deactivate-mark)
    (ring-insert find-tag-marker-ring (point-marker))
    (peng-citre-jump)))

目前jdk的tags里面,我把spring-boot的代码也加进去了。

然后我写java的时候,在一个项目里面,还是用本项目的tags在项目内跳转。如果是java或者spring的定义。我就用这个函数跳到jdk或者spring的目录里面去查。而在jdk和spring目录里面,又可以用他们自己tags了。

这样的话,就是我在任意地方都有对jdk的快速跳转的功能。一个类有什么方法也不用用脑袋记了,直接跳进去看源码。主要是速度是真的快啊。

同样的,我理解不只是java,其它的也可以这么玩。这个基本满足我目前阅读代码的需求了。就是补全还是只能限制在当前项目的tags里面。如果补全也可以选择的话,写代码我觉得都基本够用了。

还有就是,我想问下,citre能支持ignorecase不呢? :slight_smile:

谢谢!还是很值得参考的。如果能像这样专门针对一个 tags 文件定义命令的话就很方便,但是想在 Citre 里面做成通用的话,用起来肯定还是会有点繁琐。

我现在的想法是提供两种方式切换 tags 文件,一种是一键从一个列表里面选择一个 tags 文件(列表可以用户自定义),再一键执行一个命令(命令也可以自定义),执行完以后就恢复到原先的 tags 文件;另一种就是完全切换到另一个 tags 文件。

citre能支持ignorecase不呢?

补全的话现在有 citre-tags-completion-case-sensitivecitre-global-completion-case-sensitive,对跳转暂时没有支持。

这个是一种思路。或者是不是可以参考一下xcscope里面的 cscope-database-regexps 的思路。它可以不同的目录配置使用不同的cscope文件。

主要是我觉得,在读源码这种很烧脑的任务时,脑袋最好是不要被中断。比如我在读一个java代码时,需要跳到jdk的源码里。这个时候要我再选tags的话,感觉脑袋就被中断了。有点影响体验。

直接设计成在一个tags文件里查找,查找不到就去下一个tags文件里查找,这样子的设计目前的难点在什么地方呢? 原生vim里就是可以设置多个tags路径的的, setlocal tags = aaa,bbb,ccc,这个是一个 buffer local 的值。

实现上都没什么难点,只是我觉得每种方案都有使用上的问题。

因为很多语言是允许符号重名的,您说的这种方案可能遇到「我知道我想查一个库里面的符号,但 Citre 只给我自己代码里面的同名符号」的问题。