Citre: 先进的 Ctags 前端

就是 emacs -Q 测试的,load-library citre 就报这个错

(add-to-list 'load-path "/home/kino/.emacs.d/straight/repos/citre/")
M-x load-library citre
=> Loading /home/kino/.emacs.d/straight/repos/citre/citre.el (source)...done
M-x emacs-version
GNU Emacs 27.2 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.27, cairo version 1.17.4) of 2021-03-27
$ git log -n 1
commit 6bd9c512e2b08d2ff9c3e5f67341dc9c4115311b (HEAD -> master, origin/master, origin/develop, origin/HEAD, develop)
Author: AmaiKinono <[email protected]>
Date:   Sat Jul 10 19:16:54 2021 +0800

    citre-mode, fix: properly disable citre-mode when tags file not found

ctags-command-line

emacs -Q测试了一下,还是会复现。下面是我的测试配置:

(add-to-list 'load-path "~/.emacs.d/data/unsync/elpa28/citre-20210709.2132/")
(require 'citre-config)
(require 'citre)

(setq citre-tags-files '("tags" "TAGS"))
(setq citre-completion-case-sensitive nil)
(setq-default citre-enable-capf-integration t)
(setq-default citre-enable-imenu-integration nil)

(add-to-list 'load-path "~/.emacs.d/data/unsync/elpa28/company-20210709.1110/")
(require 'company)

(define-key company-active-map (kbd "C-n") 'company-select-next)
(define-key company-active-map (kbd "C-p") 'company-select-previous)
(define-key company-active-map (kbd "C-o") 'company-filter-candidates)

(setq company-backends '(company-capf (company-keywords company-dabbrev-code) company-files company-dabbrev))
(setq company-auto-complete t)
(setq company-idle-delay 0.1)
(setq company-minimum-prefix-length 3)
(setq company-show-numbers t)
(setq company-tooltip-minimum 10)
(setq company-selection-wrap-around t)
(setq company-begin-commands '(self-insert-command org-self-insert-command c-electric-lt-gt c-electric-colon))
(setq company-auto-commit-chars (lambda (s) nil))
(setq company-transformers '(company-sort-by-occurrence))


(global-company-mode t)

那个是让你编辑 ctags 命令行参数的,当然得是可编辑的了

我知道了,你是不是强制推送分支了? 代码冲突了,我 git pull 没成功

develop 有,master 没有

我删除重新添加了 master 分支最新代码好了。

1 个赞

我用 Elisp 和 C 试了一下,复现不了。

我跟你说,咱们先不要管 company。我希望你能在碰到问题的位置试一下:

M-x eval-expression RET (citre-get-symbol) RET

看看光标是不是确实会跳。

  • 如果会跳的话,我希望你能把文件内容和发生问题的位置提供给我。或者你试试构造一个小一点的例子也可以。

  • 如果不会的话,试一下 M-x completion-at-point(默认快捷键是 C-M-i)。如果会跳,希望你能把文件内容、位置、还有用的 tags file 提供给我。

如果都不会的话,可能就不是 Citre 的问题,至少不只是 Citre 的问题。

我自己用的是 27.2,看你用的好像是 28,也没准是这个问题。

发现跟company的一个设置有关,是这个:

(setq company-transformers '(company-sort-by-occurrence))

这个设置改回默认值nil就不会有肉眼可见的光标四处跳了。

我以前一直用这个设置却没问题可能是因为其他的补全后端不像citre这样会返回几十甚至几百个候选项。

哦,那是我理解错了。

这个也是我一直想做「交互式过滤工具」的原因 :rofl:

基于 Ctags 的方案不能做语义分析,结果多是肯定的,但这样的话 tag 里面记录的那些类型、继承等信息又浪费掉了。唯一的方法就是允许用户手工二次过滤,甚至直接从 tags 文件中一次过滤。

参见这一楼

刚推送了一个小补丁:

如果工程目录之外的外部库被 tag 了的话,跳转到里面的定义就会离开工程目录,tags 文件就找不到了,这样就不能继续跳转了。

有了这个补丁以后,使用 citre-jumpcitre-peek 时,如果定义位置所在的 buffer 没有可用的 tags 文件,就会自动使用我们过来的那个地方的 tags 文件。这样就可以一路追踪外部库里面的调用链了。

我试着设置了 citre-tags-file-global-cache-dir “~/.cache/tags/” citre-default-create-tags-file-location 'global-cache 现在每次的tags文件总是生成到我的根目录下,并没有生成到"~/.cache/tags/“里?最初的那个不需要设置的citre版本里是默认生成到”~/.cache/tags/",这个版本好像不行了,我的写法有问题吗?

另外有哪位知道怎么解析Yaml文件的吗?我设置语言为Yaml,生成的tags里面是空的;解析C文件确实是好的?求助各位啊,谢谢;

uctags 目前对 yaml 只能记录 anchor。如果 ctags 对你的 yaml 文件没有给出期望的输出,可以给 ctags 报 bug 或者自己用正则扩展一下。

缓存目录的问题我下班以后帮你看下,但我感觉应该不是 Citre 的问题,建议你先试试从 $ emacs -Q 开始能不能复现。

我的运行环境是win10,emacs28;我看了一下代码,好像 (defun citre-tags-file-in-global-cache (dir) “Return the tags file name of DIR in global cache dir. DIR is absolute. The full path of the tags file is returned.” (concat (or (file-remote-p default-directory) “”) (expand-file-name (citre–path-to-cache-tags-file-name (file-local-name dir)) citre-tags-file-global-cache-dir))) 这个函数的返回总是根目录。似乎是windows文件名格式的问题?但是初始的citre的版本似乎是好的。

我知道了。之前的方案,缓存目录下的 tags 文件名用的是 md5,这次为了更可读,用的是感叹号分割的路径名。比如你的工程在 /home/user/project,tags 文件就叫做 !home!user!project.tags

在 Windows 下这样会导致文件名里有冒号:

(citre--path-to-cache-tags-file-name "d:/project")
=> d:!project.tags

导致 Emacs 把它当成绝对路径,因而不能算出它在缓存目录下的路径:

(expand-file-name "d:!project.tags" "d:/cache/dir/")
=> d:!project.tags

我之后想一下怎么处理。可能直接把这个冒号干掉就行。

最新版本已经修复了(如果你用 melpa 的话可能要等几个小时才有)

刚发布了 0.1 版本。

没什么重大更新,只是加了捐赠链接

欢迎给我买杯咖啡、可乐或者果汁 :wink:

/home/feng/.cache/tags/!home!feng!projects!mygnuhealth!mygnuhealth!.tags doesn't contain recipe for updating.  Edit its recipe? (y or n) 

这个信息是什么意思? 每次运行 citre-update-this-tags-file 都会出现

找到原因了:ctags 版本太低,编译最新版本后就正常工作了。

1 个赞