Exuberant Ctags处理Python代码生成标签过少问题求助
我有一段Python代码如下(最小可复现代码):
myGlob = 1 def countMe(): for i in range(10): print(i) def countMeAgain(): for i in range(10): print(i) if __name__ == "__main__": countMe() countMeAgain() myGlob = 2
运行ctags abc.py生成tag文件后,打开只看到:
print abc.py /^ print(i)$/
我预期能看到countMe、countMeAgain和myGlob的标签,请问这是为什么?
我已经排查过的操作:
- 我用的是OSX + Vim,通过Homebrew安装了Exuberant Ctags。
- OSX默认有功能受限的ctags版本,我已经确认
/private/etc/paths中/usr/local/bin(Homebrew安装的ctags所在路径)优先级高于/usr/bin,不会用到默认版本。
问题原因与解决办法
哎,这个问题其实是代码缩进不规范导致的!Exuberant Ctags对Python代码的解析特别依赖标准缩进——毕竟Python是靠缩进区分代码块的语言嘛。你原来的代码里,函数定义、循环语句全都挤在一行或者没有正确缩进,Ctags的Python解析器根本认不出这些是函数、全局变量,只能识别到有缩进的print(i),所以只生成了print的标签。
具体解决步骤:
- 先把代码缩进改对:按照Python的规范,函数体、循环语句都要缩进4个空格,修正后的代码是这样的:
myGlob = 1 def countMe(): for i in range(10): print(i) def countMeAgain(): for i in range(10): print(i) if __name__ == "__main__": countMe() countMeAgain() myGlob = 2
- 重新生成标签:再跑一遍
ctags abc.py,打开tag文件就能看到你想要的countMe、countMeAgain和myGlob标签了,输出大概是这样:
countMe abc.py /^def countMe():$/ countMeAgain abc.py /^def countMeAgain():$/ myGlob abc.py /^myGlob = 1$/ print abc.py /^ print(i)$/
额外小提示
要是你还担心是不是用错了ctags版本,可以跑个ctags --version,如果输出里有Exuberant Ctags的字样,就说明用的是Homebrew装的那个正确版本,彻底排除版本问题。
内容的提问来源于stack exchange,提问作者Muno
相关产品推荐
相关产品推荐

