我正在使用带有ctags的Vim来处理Python代码,对于类、字段等方面它非常好用,但似乎不包括Python文件名,也就是模块名称。这是否可行?我更喜欢通过键入 ta <module>
来跳转到一个模块,而不是像NERDtree这样的文件浏览器一级一级地导航,而且我已经习惯了在Java中这样做,因为类名就是文件名。
我正在使用带有ctags的Vim来处理Python代码,对于类、字段等方面它非常好用,但似乎不包括Python文件名,也就是模块名称。这是否可行?我更喜欢通过键入 ta <module>
来跳转到一个模块,而不是像NERDtree这样的文件浏览器一级一级地导航,而且我已经习惯了在Java中这样做,因为类名就是文件名。
--extra=+f
选项。详情请参阅http://ctags.sourceforge.net/ctags.html#OPTIONS 上的 man 页面。使用--extra=+f
参数的Exuberant tags会为Python文件名(例如my_module.py
)生成标签,但不会为模块名(例如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