如何使用ctag浏览内置的python源代码?

时间:2014-07-29 01:16:06

标签: vim ctags

我在项目路径中创建了一个ctag文件:

/home/zen/zen_project

我可以轻松地跳转到这个项目中。

但是,当我想跳转到内置模块方法(或安装在sys路径下)时,例如龙卷风。 我无法做到。

我尝试在龙卷风路径中构建另一个标记文件,但这只能启用龙卷风文件本身之间的跳转。我仍然无法从我的项目文件跳转到龙卷风文件。

是否可以使用vim和ctag进行此类跳转,该怎么做?

2 个答案:

答案 0 :(得分:3)

您的项目根目录中应该有一个tags文件,Tornado根目录中应该有一个'tags'文件。使用~/.vimrc选项的默认值,Vim将获取当前目录和当前文件中的文件。

您需要明确指定其他任何位置,例如将其放入:set tags+=/path/to/tornado/tags

:echo tagfiles()

要检查考虑哪些标记文件,您可以使用:

{{1}}

答案 1 :(得分:1)

我个人使用cscope而不是ctags来索引我的项目,因为它更强大。它在Vim中得到支持。您可以从项目目录中的文件生成索引,然后可以在Vim(或通过shell)中使用命令:

:cscope add /path/to/cscope-database-index # add the database index file
:cscope find f os.py # find file
:cscope find s system # find symbol
:cscope find t TODO # find text string
:cscope find g rmdir # find definition

如果要添加Python语言源代码或某些模块(如tornado),则需要索引源目录并使用cscope add添加索引。 Cscope可以同时添加数据库索引,因此您应该能够跳转到模块的文件中,然后按Ctrl + o返回项目。

E.g。有关Python源代码的示例:

  1. 您从https://www.python.org/download/获取源代码的tarball(例如https://www.python.org/ftp/python/3.4.1/Python-3.4.1.tgz)。
  2. 解压缩并使用cscope -R或类似我所包含的脚本在该文件夹中生成数据库。
  3. cscope手动添加数据库索引或将vim设置为cscope在BufRead上自动添加源。此外,Vim应该在当前目录中选择一个cscope数据库。
  4. 您可以使用http://cscope.sourceforge.net/cscope_vim_tutorial.html中的cscope_maps.vim为上述命令添加关键快捷键。

    我使用以下脚本在当前目录中生成我的数据库(您可能只对.py文件感兴趣):

    #!/usr/bin/python
    
    import os
    import pdb
    import time
    import sys
    
    INCLUDED_FILES = ['.py', '.rb', '.java', '.c', '.h', '.cpp', '.cc', '.hpp', '.html', '.js', '.mk', '.xml', '.idl']
    EXCLUDED_DIRS = ['.git', '.repo', 'out', '.svn']
    OUTPUT_FILE = 'cscope.files'
    
    start_time = time.time()
    output_file = open(OUTPUT_FILE, 'w')
    
    current_path = os.path.abspath('.')
    
    for root, dirs, files in os.walk(current_path):
        for directory in EXCLUDED_DIRS:
            if directory in dirs:
                dirs.remove(directory)
    
        for filename in files:
            name, extension = os.path.splitext(filename)
            if extension in INCLUDED_FILES:
                file_path = os.path.join(root, filename)
                output_file.write('"%s"' % file_path + "\n")
                print(file_path)
    
    # -b: just build
    # -q: create inverted index
    cmd = 'cscope -b -q'
    print(cmd)
    os.system(cmd)
    
    elapsed_time = time.time() - start_time
    print("\nGeneration of cscope database took: %.3f secs" % elapsed_time) 
    

    希望有所帮助。