如何配置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_
相关产品推荐
相关产品推荐

