Citre: 先进的 Ctags 前端

我试着设置了 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 个赞

支持一下!

是否有函数支持由用户输入要搜索的symbol,而不是从光标位置得到要搜索的symbol?

在没有符号的地方按 xref-find-definitions 就可以。以后会做一个更好的交互式过滤工具

(defun citre-edit-cmd-buf-add-lang ()
  "Insert a language in the command editing buffer.
This command requires the ctags program from Universal Ctags."
  (interactive)
  (when-let* ((ctags (or citre-ctags-program "ctags"))
              (langs (with-temp-buffer
                       (ignore-errors
                         (call-process "ctags" nil (current-buffer) nil
                         ----------------------------------------------- 这个地方应该是用 ctags 符号吧?
                                       "--list-languages")
                         (split-string (buffer-string) "\n" t))))
              (lang (completing-read "Select a language: " langs)))
    (insert lang ",")))

我感觉这个地方的提示应该优化一下,如果遇到这种情况,最好让用户检查一下 ctags 是否版本太低。

这个其实应该只是因为你第一次生成的时候没有用 Citre。编辑一次 recipe 以后就不会再提醒了。

理论上 Citre 只要求 readtags 的版本,生成 tags 你甚至可以不用 uctags,比方说 hasktags、gotags 都应该是可以用的。

是,谢谢!我回去修一下。

我这个折腾了半天,是不是因为当前工作目录没保存到 tags文件中导致的?

如果 working directory 没有写入的话确实会出现这个情况,但这个事是 Citre 做的,应该跟 ctags 程序没关系。

你可以看下出问题的文件里有没有 !_TAG_PROC_CWD 这个 tag

这种交互一般convention是通过C-u按键前缀,可以考虑一下。

我再测试测试

我用 emacs.git 测试了一下,citre-create-tags-file 好像没有添加 !_TAG_PROC_CWD

!_CITRE_CMD	ctags|-o|%TAGSFILE%|--languages=EmacsLisp,C|--kinds-all=*|--fields=*|--extras=*|-R	/command line to generate this tags file/;"
!_TAG_FILE_FORMAT	2	/extended format; --format=1 will not append ;" to lines/;"	extras:pseudo
!_TAG_FILE_SORTED	1	/0=unsorted, 1=sorted, 2=foldcase/;"	extras:pseudo
!_TAG_OUTPUT_FILESEP	slash	/slash or backslash/;"	extras:pseudo
!_TAG_OUTPUT_MODE	u-ctags	/u-ctags or e-ctags/;"	extras:pseudo
!_TAG_PATTERN_LENGTH_LIMIT	96	/0 for no limit/;"	extras:pseudo
!_TAG_PROGRAM_AUTHOR	Universal Ctags Team	//;"	extras:pseudo
!_TAG_PROGRAM_NAME	Universal Ctags	/Derived from Exuberant Ctags/;"	extras:pseudo
!_TAG_PROGRAM_URL	https://ctags.io/	/official site/;"	extras:pseudo
!_TAG_PROGRAM_VERSION	0.0.0	//;"	extras:pseudo

谢谢。可以说下你测试的步骤吗?我回家看一下

就是简单的三步骤:

  1. 打开 emacs.git 下一个c 文件
  2. 运行 citre-create-tags-file
  3. 运行 citre-update-this-tags-file

我猜测是不是老的 ctags 运行有什么特殊情况,导致添加 !_TAG_PROC_CWD 的函数没有执行

1 个赞
期望状态=未知(u)/安装(i)/删除(r)/清除(p)/保持(h)
| 状态=未安装(n)/已安装(i)/仅存配置(c)/仅解压缩(U)/配置失败(F)/不完全安装(H)/触发器等待(W)/触发器未决(T)
|/ 错误?=(无)/须重装(R) (状态,错误:大写=故障)
||/ 名称            版本              体系结构     描述
+++-===============-=================-============-=================================================
ii  universal-ctags 0+git20200824-1.1 amd64        build tag file indexes of source code definitions