用python实现一个按需生成用于vim跳转的tags文件的小程序
2010-12-04 22:57
1166 查看
初学python,找个有用的来练手。选定了一个我早就想做的让vim按需生成tags跳转文件的小程序。
vim的tags用于跳转的好处自是不用多说,但是如何生成tags确实困扰我的一大问题,用VS的都知道,VS会为每个解决方案生成一个ncb文件用于自动提示,相当于tags的功能,这个ncb文件很智能,它会根据你所包含的头文件来自动处理。这样,你只需包含一个头文件,就可以出现该头文件相关的自动提示了。
但是vim就没有像VS这么智能了,目前我的做法就是在某个目录下调用ctags,然后加上递归参数,这样的缺点就是会生成一个很大的tags文件,里面很多都是项目根本没用到的头文件的tags。为了改善这种情况,需要有一个按所用到的头文件来生成tags的方法,让ctags按需生成tags。
ctags本身是支持从一个文件中读入需要生成tags的文件列表的,因此剩下的问题就是如何找到项目所用到的所有相关的C++文件,然后让ctags从这些文件中生成tags。这就是我拿来练手的小程序了。
python的好处就是不用像C++那样考虑那么多不相关的细节,专注于你想做的。代码如下,应该还算精简吧。有更好的方法不妨评论分享下,:)
vim的tags用于跳转的好处自是不用多说,但是如何生成tags确实困扰我的一大问题,用VS的都知道,VS会为每个解决方案生成一个ncb文件用于自动提示,相当于tags的功能,这个ncb文件很智能,它会根据你所包含的头文件来自动处理。这样,你只需包含一个头文件,就可以出现该头文件相关的自动提示了。
但是vim就没有像VS这么智能了,目前我的做法就是在某个目录下调用ctags,然后加上递归参数,这样的缺点就是会生成一个很大的tags文件,里面很多都是项目根本没用到的头文件的tags。为了改善这种情况,需要有一个按所用到的头文件来生成tags的方法,让ctags按需生成tags。
ctags本身是支持从一个文件中读入需要生成tags的文件列表的,因此剩下的问题就是如何找到项目所用到的所有相关的C++文件,然后让ctags从这些文件中生成tags。这就是我拿来练手的小程序了。
python的好处就是不用像C++那样考虑那么多不相关的细节,专注于你想做的。代码如下,应该还算精简吧。有更好的方法不妨评论分享下,:)
# by absolute8511 2010-12-04
import os,sys from os import path import string,re #在系统头文件目录下查找系统头文件,可以自行添加头文件路径 def findsysinclude(filename,includepath): if filename==None: return None sysincludepath = ['/usr/include/','/usr/include/c++/4.4/', '/usr/lib/gcc/i486-linux-gnu/4.4/include/','/usr/include/c++/4.4/i486-linux-gnu/'] #系统头文件目录 includepath += sysincludepath for onepath in includepath: if path.isfile(onepath+filename): return onepath+filename print 'Not found: '+filename return None #读取用户传入的头文件路径参数 args = sys.argv print args retest = re.compile(r'\.cpp$|\.c$|\.h$|\.hpp$|\.cc$',re.IGNORECASE) cppfiles = [] #查找用户项目路径下的所有源文件 for root,dirs,files in os.walk(os.getcwd()): oldlen = len(cppfiles) cppfiles += filter(lambda x:retest.search(x)<>None,files) #过滤非C/C++文件 for index in range(oldlen,len(cppfiles)): cppfiles[index] = root + '/' + cppfiles[index]; oldstdout = sys.stdout sys.stdout= logfile = open('maketags.log','w') print 'total cpp files: ' + str(len(cppfiles)) includetest = re.compile(r'\s*#include\s*((<(?P<sysincludefile>.*?)>)|("(?P<userincludefile>.*?)"))') ## *?代表不贪婪匹配 #对每个C++源文件,查找它包含的头文件以及它的头文件所包含的头文件,以次递归直到全部包含 #由于已经遍历过用户目录了,因次只需要再把系统头文件加近来即可 for cppfile in cppfiles: try: fp = open(cppfile,'r') print 'finding in file: '+cppfile for line in fp: result = includetest.search(line) #正则匹配头文件 if result <> None: print 'Matched include line is:'+result.group() tmp = findsysinclude(result.group('sysincludefile'),args[1:]) tmp2 = findsysinclude(result.group('userincludefile'),args[1:]) #用户头文件也去找系统目录 if tmp<>None and cppfiles.count(tmp)==0: cppfiles += [tmp] print 'Added sys files: '+tmp # tmp2 = path.abspath(path.dirname(cppfile)+'/'+result.group('userincludefile')) if tmp2<>None and cppfiles.count(tmp2)==0: cppfiles += [tmp2] print 'Added user files: '+tmp2 finally: fp.close() try: filelist = open('python_tags_filelist','w') filelist.writelines('\n'.join(cppfiles)) finally: filelist.close() print 'total cpp and include files:'+str(len(cppfiles)) # print 'after delete duplicate files: ' + str(len(set(cppfiles))) sys.stdout = oldstdout logfile.close() os.system('ctags --c++-kinds=+p --fields=+iaS --extra=+q -L python_tags_filelist')
相关文章推荐
- 本文以python实现了一个日志文件中ip提取与统计程序
- Python实现的用于从布局文件的id生成成员变量声明和findViewById语句的Android开发小工具
- Python脚本生成的exe文件自动升级程序实现方法
- Python实现一个双色球生成程序
- python 实现一个双色球生成程序
- linux用文件锁实现保证一个程序只能启动一个进程
- Python实现合并同一个文件夹下所有txt文件的方法示例
- 用Python实现CSV格式文件转换为HTML文件[Python3程序开发指南实现]
- Python 练习册,每天一个小程序----------001使用 Python 如何生成多位随机数
- 一个简单的实现复制文件并修改文件扩展名的小程序
- python - 自定义一个递归函数用于递归遍历指定目录下的所有文件
- 一个spring+hibernate开发的小程序的修改(其中配置文件使用的是HibernateSynchronizer插件生成)
- 完成一个学生管理程序,使用学号作为键添加5个学生对象,并可以将全部信息保存在文件中,可以实现对学生信息的学号查找,输出全部学生信息的功能。
- 用Python编写函数实现 创建一个.txt文件或者.doc文件
- Linux下安装pyinstaller用于将py文件打包生成一个可执行文件
- python 实现自动上传文件到百度网盘(附程序源码及实现过程)
- python处理文本文件实现生成指定格式文件的方法
- 用eclipse如何将java程序生成一个.exe可运行文件?
- python实现对文件中图片生成带标签的txt文件
- Python实现的一个找零钱的小程序代码分享