Citre: 先进的 Ctags 前端

支持一下!

是否有函数支持由用户输入要搜索的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

另外我有一个疑惑的地方,假如我正在编辑: ~/emacs.git/src/atimer.c

那么:

  1. 工作目录必须设置为: ~/emacs.git/src
  2. ctags 运行目录可以设置为: ~/emacs.git/

有没有可能工作目录也设置为: ~/emacs.git/ 呢?

你想用这个 tags 文件的目录,ctags 运行的目录,被扫描的目录和文件,这三个东西都可以分别设置。

:rofl: 我又仔细读了下,其实我想问你理解的工作目录是什么呢?我说的工作目录就是 ctags 运行的目录

还有上面那个 tags 文件不能更新的问题,你有没有改动 Citre 的一些用户选项呢?系统是什么系统?

我现在略微有点怀疑 Elisp 写文件的函数(write-region)是不是不会等文件写好了就返回 :rofl: 我已经碰到过疑似这样的问题了

我用的 debian testing, emacs28 --with-native-compilation, 不过 emacs27 试了一下,也有类似的问题。

比如:

emacs.git 这个 project,里面有 src lisp 等许多目录, 如果我打开 src/1.c, 我认为的工作目录就是 emacs.git/src/, 而 ctags 运行目录,可以是 emacs.git/src/ 也可以是 emacs.git

当前默认的行为,如果像这种 src lisp 子目录很多时,就比较罗嗦,因为要每个目录都生成 tags 文件。

这个我不太了解。。。。

像这个情况,我觉得好的办法是 ctags 的运行目录,和使用 tags 文件的目录,都设为 emacs.git/。你在 emacs.git/src/ 之类的子目录下的时候,如果 Citre 没有为你所说的「工作目录」找到对应的 tags 文件,它会自己一层一层目录往上找,所以其实还是能找到的。

这个问题是不存在的。在编辑命令行的时候,你可以在 -R 后面添加任意多的目录和文件,除非你改过 citre-use-project-root-when-creating-tags,创建 tags 文件的时候会不让你编辑命令行,但你也可以之后再编辑 recipe。再或者直接把整个仓库都扫了也行吧。