在Vim中使用ctags导航Python模块?

时间:2014-05-28 15:23:28

标签: python vim ide ctags exuberant-ctags

我正在使用带有ctags的Vim for Python,并且它非常适用于类,字段等,但它似乎不包括Python文件名,也就是模块名称。这可能吗?我更喜欢键入ta <module>来跳转到模块,而不是像NERDtree这样的文件浏览器逐级导航,而且我已经习惯于在Java中这样做了名称是文件名。

2 个答案:

答案 0 :(得分:6)

如果使用旺盛的ctags生成标记文件(还有其他方法吗?),请尝试添加--extra=+f选项。有关详细信息,请参阅http://ctags.sourceforge.net/ctags.html#OPTIONS的手册页。

答案 1 :(得分:0)

Exuberant标记(my_module.py)会为python文件名(例如my_module)生成标记,但不会为模块名称生成标记(例如ptags)。我最终创建了ptags脚本的修改版本。将以下内容保存到路径中某个名为#! /usr/bin/env python # ptags # # Create a tags file for Python programs, usable with vi. # Tagged are: # - functions (even inside other defs or classes) # - classes # - filenames # Warns about files it cannot open. # No warnings about duplicate tags. import sys, re, os import argparse tags = [] # Modified global variable! def main(): for root, folders, files in os.walk(args.folder_to_index): for filename in files: if filename.endswith('.py'): full_path = os.path.join(root, filename) treat_file(full_path) if not args.recursive: break if tags: fp = open(args.ctags_filename, 'w') tags.sort() for s in tags: fp.write(s) expr = '^[ \t]*(def|class)[ \t]+([a-zA-Z0-9_]+)[ \t]*[:\(]' matcher = re.compile(expr) def treat_file(filename): try: fp = open(filename, 'r') except: sys.stderr.write('Cannot open %s\n' % filename) return base = os.path.basename(filename) if base[-3:] == '.py': base = base[:-3] s = base + '\t' + filename + '\t' + '1\n' tags.append(s) while 1: line = fp.readline() if not line: break m = matcher.match(line) if m: content = m.group(0) name = m.group(2) s = name + '\t' + filename + '\t/^' + content + '/\n' tags.append(s) if __name__ == '__main__': p = argparse.ArgumentParser() p.add_argument('-f', '--ctags-filename', type=str, default='tags') p.add_argument('-R', '--recursive', action='store_true') p.add_argument('folder_to_index', type=str, default='.') args = p.parse_args() main() 的文件中,并使其可执行:

ptags -R -f tags_file_to_create /path/to/index

现在运行以下命令,通过递归处理当前目录来生成标记文件:

{{1}}