【发布时间】: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