【问题标题】:Getting list of results from etags.el从 etags.el 获取结果列表
【发布时间】:2014-03-21 00:42:16
【问题描述】:

我正在使用 exuberant ctags 生成一个标签文件(emacs 格式),我传递了这个附加标志:

--regex-PHP=/do\_action\(\ '([a-zA-Z0-9\_]+)'/\1/a,actions/

成功捕获了我想要的,问题是我想使用 emacs lisp 以列表的形式返回所有标记为“a”的标签——或者我什至会满足于匹配 do_action 的正则表达式。

不幸的是,似乎 etags.el 中的所有内容都面向交互式使用,find-tag-in-order 是我能想到的唯一非交互式方式,但无论是否匹配,我的代码都会返回错误消息:

(find-tag-in-order
 "test_string"
 find-tag-regexp-search-function
 find-tag-regexp-tag-order
 find-tag-regexp-next-line-after-failure-p
 "matching"
 t)

在执行交互式 M-x find-tag test_string 时,会将我带到文件和定义它的位置。

理想的用法是这样的: (tags-of-type "a")(tags-matching "do_action")。虽然我知道标记的 name 是我的正则表达式的括号组中匹配的内容。

有什么想法吗?

更新: 虽然这不能解决以 emacs lisp 列表形式获取标签的问题,但我意识到使用 --PHP-kinds 参数可以为每种类型维护多个标签文件。

在这种方法中,方法(虽然不工作)是这样的:

(let ((tags-table-list '("tag-file-1")))
  (tags-search "specific-to-tag-file-1"))

【问题讨论】:

  • 交互函数可以像任何其他函数一样被调用,那么从你的代码中调用(find-tag test_string)有问题吗?
  • 是的 - 从 elisp 调用该函数也以交互方式执行,而不是将匹配的标签作为字符串返回。
  • 您可以查看etags-select 库以获取示例实现。

标签: emacs elisp ctags exuberant-ctags


【解决方案1】:

我想,你想要的是(tags-completion-table)。它返回一个符号数组,这些符号是当前 TAGS 表中的条目。

无论如何,根据你所追求的,我认为函数tags-completion-table 及其同名的缓存变量是开始的地方。两者都在库 etags.el 中定义。

(如果您需要字符串列表而不是符号数组,只需使用mapatomssymbol-name。)

【讨论】:

  • 实际上我不得不使用mapcar,但它确实有效。由于 etags 不会分隔类型,因此是否考虑过使用多个标签文件? (关于我在原始问题中的最后一个代码 sn-p)
  • 你应该使用mapatoms,而不是mapcar,来遍历一个obarray。不知道你最后一个问题是什么意思(例如,“不会分离类型”?)。
  • 您不使用mapatoms 作为其结果。您仅将其用于其副作用(请参阅文档字符串)。您可以将本地 var 绑定到 (),然后使用 mapatoms 将符号名称推送到它。然后您将使用 var 的值(例如,返回它)。 obarray 不是一个普通的向量。 See (elisp) Creating Symbols,特别是这部分(见下一条评论):
  • "在 Emacs Lisp 中,obarray 实际上是一个向量。向量的每个元素都是一个桶;它的值是一个内部符号,其名称散列到该桶,如果桶为空,则为 0 . 每个实习符号都有一个内部链接(用户不可见)到存储桶中的下一个符号。因为这些链接是不可见的,所以除了使用`mapatoms之外没有办法找到obarray中的所有符号'(下)。桶中符号的顺序并不重要。”
  • visit-tags-tablevisit-tags-table-buffertags-file-name
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 2013-05-06
  • 1970-01-01
  • 2022-01-03
相关资源
最近更新 更多