You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Universal Ctags识别带别名的命名空间导入函数?

配置Universal Ctags识别带命名空间别名的函数跳转

需求说明

我需要配置Universal Ctags,让它能识别从不同命名空间导入并使用别名的函数。在Clojure(附JavaScript示例)开发中,模块通常有独立命名空间,导入时为命名空间设置别名是常见操作,希望光标定位到别名/函数名时,能直接跳转到原命名空间的函数定义。


Clojure示例

模块文件(my/module.clj)

(ns my.module)

(defn my-fn []
  "hello world")

主文件(my/main/path.clj)

(ns my.main.path
  (:require
    [my.module :as mod]))

;; 本文件未使用的本地函数
(defn my-fn []
  "say hi")

(defn main []
  (mod/my-fn))

期望效果

光标定位到mod/my-fn时,跳转至my.module命名空间下的my-fn定义,而非当前文件的本地my-fn。

运行ctags -R生成的tags文件内容

!_TAG_EXTRA_DESCRIPTION anonymous   /Include tags for non-named objects like lambda/
!_TAG_EXTRA_DESCRIPTION fileScope   /Include tags of file scope/
!_TAG_EXTRA_DESCRIPTION pseudo  /Include pseudo tags/
!_TAG_EXTRA_DESCRIPTION subparser   /Include tags generated by subparsers/
!_TAG_FIELD_DESCRIPTION epoch   /the last modified time of the input file (only for F\/file kind tag)/
!_TAG_FIELD_DESCRIPTION file    /File-restricted scoping/
!_TAG_FIELD_DESCRIPTION input   /input file/
!_TAG_FIELD_DESCRIPTION name    /tag name/
!_TAG_FIELD_DESCRIPTION pattern /pattern/
!_TAG_FIELD_DESCRIPTION typeref /Type and name of a variable or typedef/
!_TAG_FILE_FORMAT   2   /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED   1   /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_KIND_DESCRIPTION!Clojure  a,namespacealias    /namespacealias/
!_TAG_KIND_DESCRIPTION!Clojure  f,function  /functions/
!_TAG_KIND_DESCRIPTION!Clojure  n,namespace /namespaces/
!_TAG_KIND_DESCRIPTION!Clojure  v,variable  /variable/
!_TAG_OUTPUT_EXCMD  mixed   /number, pattern, mixed, or combineV2/
!_TAG_OUTPUT_FILESEP    slash   /slash or backslash/
!_TAG_OUTPUT_MODE   u-ctags /u-ctags or e-ctags/
!_TAG_OUTPUT_VERSION    0.0 /current.age/
!_TAG_PARSER_VERSION!Clojure    0.0 /current.age/
!_TAG_PATTERN_LENGTH_LIMIT  96  /0 for no limit/
!_TAG_PROC_CWD  /home/jp/clj-tmp/   //
!_TAG_PROGRAM_AUTHOR    Universal Ctags Team    //
!_TAG_PROGRAM_NAME  Universal Ctags /Derived from Exuberant Ctags/
!_TAG_PROGRAM_URL   https://ctags.io/   /official site/
!_TAG_PROGRAM_VERSION   6.1.0   /7cc5308a4/
main    my/main/path.clj    /^(defn main []$/;" f
main    my/main/path.clj    /^(defn main []$/;" f   namespace:my.main.path
my-fn   my/main/path.clj    /^(defn my-fn []$/;"    f
my-fn   my/main/path.clj    /^(defn my-fn []$/;"    f   namespace:my.main.path
my-fn   my/module.clj   /^(defn my-fn []$/;"    f
my-fn   my/module.clj   /^(defn my-fn []$/;"    f   namespace:my.module
my.main.path    my/main/path.clj    /^(ns my.main.path$/;"  n
my.module   my/module.clj   /^(ns my.module)$/;"    n

JavaScript示例

模块文件(module.js)

// module.js
export function greet() {
    console.log('Hello, world!');
}

主文件(main.js)

// main.js
import * as myModule from './module';

function greet() {
    console.log('hi, world!');
}

myModule.greet();

运行ctags -R生成的tags文件内容

!_TAG_EXTRA_DESCRIPTION anonymous   /Include tags for non-named objects like lambda/
!_TAG_EXTRA_DESCRIPTION fileScope   /Include tags of file scope/
!_TAG_EXTRA_DESCRIPTION pseudo  /Include pseudo tags/
!_TAG_EXTRA_DESCRIPTION subparser   /Include tags generated by subparsers/
!_TAG_FIELD_DESCRIPTION epoch   /the last modified time of the input file (only for F\/file kind tag)/
!_TAG_FIELD_DESCRIPTION file    /File-restricted scoping/
!_TAG_FIELD_DESCRIPTION input   /input file/
!_TAG_FIELD_DESCRIPTION name    /tag name/
!_TAG_FIELD_DESCRIPTION pattern /pattern/
!_TAG_FIELD_DESCRIPTION typeref /Type and name of a variable or typedef/
!_TAG_FILE_FORMAT   2   /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED   1   /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_KIND_DESCRIPTION!Ctags    k,kind  /kind definitions/
!_TAG_KIND_DESCRIPTION!Ctags    l,langdef   /language definitions/
!_TAG_KIND_DESCRIPTION!JavaScript   C,constant  /constants/
!_TAG_KIND_DESCRIPTION!JavaScript   G,getter    /getters/
!_TAG_KIND_DESCRIPTION!JavaScript   M,field /fields/
!_TAG_KIND_DESCRIPTION!JavaScript   S,setter    /setters/
!_TAG_KIND_DESCRIPTION!JavaScript   c,class /classes/
!_TAG_KIND_DESCRIPTION!JavaScript   f,function  /functions/
!_TAG_KIND_DESCRIPTION!JavaScript   g,generator /generators/
!_TAG_KIND_DESCRIPTION!JavaScript   m,method    /methods/
!_TAG_KIND_DESCRIPTION!JavaScript   p,property  /properties/
!_TAG_KIND_DESCRIPTION!JavaScript   v,variable  /global variables/
!_TAG_OUTPUT_EXCMD  mixed   /number, pattern, mixed, or combineV2/
!_TAG_OUTPUT_FILESEP    slash   /slash or backslash/
!_TAG_OUTPUT_MODE   u-ctags /u-ctags or e-ctags/
!_TAG_OUTPUT_VERSION    0.0 /current.age/
!_TAG_PARSER_VERSION!Ctags  0.0 /current.age/
!_TAG_PARSER_VERSION!JavaScript 1.1 /current.age/
!_TAG_PATTERN_LENGTH_LIMIT  96  /0 for no limit/
!_TAG_PROC_CWD  /home/jp/js-tmp/    //
!_TAG_PROGRAM_AUTHOR    Universal Ctags Team    //
!_TAG_PROGRAM_NAME  Universal Ctags /Derived from Exuberant Ctags/
!_TAG_PROGRAM_URL   https://ctags.io/   /official site/
!_TAG_PROGRAM_VERSION   6.1.0   /7cc5308a4/
!_TAG_ROLE_DESCRIPTION!JavaScript!function  foreigndecl /declared in foreign languages/
alias   js.ctags    /^--regex-javascript=\/^[ \\t]*import \\* as ([^ \\t,]+) from[ \\t]+[\\'"][^\\'"]+[\\'"]\/\\1\/a,a/;"   k
function    js.ctags    /^--regex-javascript=\/^[ \\t]*export[ \\t]+function[ \\t]+([a-zA-Z_$][a-zA-Z0-9_$]*)\/\\1\/f,func/;"   k
greet   main.js /^function greet() {$/;"    f
greet   module.js   /^export function greet() {$/;" f

内容的提问来源于stack exchange,提问作者Jp_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 02:58:15