我使用
ctags
为 TypeScript 项目生成标签文件。
$ ctags --version
Universal Ctags 6.0.0, Copyright (C) 2015-2022 Universal Ctags Team
Universal Ctags is derived from Exuberant Ctags.
Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
Compiled: Feb 1 2023, 00:00:00
URL: https://ctags.io/
Output version: 0.0
Optional compiled features: +wildcards, +regex, +iconv, +option-directory, +xpath, +json, +interactive, +sandbox, +yaml, +packcc, +optscript
但它没有找到嵌套函数声明。对于 JavaScript,它确实找到它们(相同的文件,除了文件类型扩展名)。
以防万一,这是我的最小可重现案例(
bar
功能不匹配):
'use strict';
foo();
function foo() {
for (const i of [0, 1, 2,]) {
bar(i);
}
function bar(ind: number) {
console.log(ind);
}
}
我应该看哪里?我正在阅读文档,但它似乎相当庞大。
在问题中我指出,嵌套函数的 JavaScript 文件标签可以工作。但事实证明这有点夸张。
如果有js文件:
'use strict';
foo();
bar();
function foo() {
for (const i of [0, 1, 2,]) {
bar(i);
}
function bar(ind) {
console.log(ind);
}
}
function bar() {
return '123';
}
并尝试在第一次调用
bar()
时使用标签,它会转到错误的声明,那是因为 ctags 有 tag_name
和 ex_cmd
的概念(通常是用于搜索文件中位置的正则表达式)。在本例中,有 2 个 bar
标签。尽管 ex 命令不同,并且在这种情况下应该正确找到 2 个声明(假设缩进级别不同,当然通常情况并非如此),但名称始终相同(我只是看不到一种方法区分两个具有相同名称的函数的名称)。所以没有办法(至少这是一件非常重要的事情)正确地进入实际的声明。
但实际上,这并不是一个大问题,因为此类嵌套函数通常在文件中距离不远,因此最好使用文本编辑器的默认功能进行搜索。
对于非嵌套声明
ctags
似乎开箱即用效果很好。
所以目前我决定不去理会这个问题,也不尝试让它与 TypeScript 一起工作,因为无论如何它都不会完美地工作(正如我所解释的,它不适用于 JavaScript)。 尝试查找嵌套函数时只需使用文本搜索。