为vim目录树插件NERDTree批量添加python模块书签

NERDTree是VIM的一个很好用的目录树插件,它提供了一项书签的功能。

比如使用 :Bookmark xxx 可以为当前目录标记为名称为xxx的书签,之后使用 :BookmarkToRoot xxx 命令即可直接跳到该目录下。

在使用vim开发python的过程中,我们时常会碰到查看第三方模块源代码的情况。我们可以通过Bookmark命令来手动为第三方模块添加书签来方便查看源代码,但是当模块多起来的话,这样做会很麻烦。

于是我这个懒人写了一个脚本批量把python的第三方模块加入到NERDTree的Bookmark中去。

# coding: utf-8
"""                            
将python的第三方模块加入到
vim插件NERDTree的书签文件中
Author: piglei2007@gmail.com
"""
import os
import sys

Bookmarks = os.path.join(os.path.expanduser('~'), ".NERDTreeBookmarks")

def get_modules():
    """获得modules"""
    ret = set() 
    for path in sys.path:
        if not path.rstrip("/").endswith("packages"):
            continue
        
        packages = [ x.split("-")[0] for x in os.listdir(path) if os.path.isdir(os.path.join(path, x)) ]
        ret.update(packages)
    return ret

def main(): 
    modules = get_modules()
    f = open(Bookmarks, "a+")
    # 已经存在的书签不做处理
    existed = set([ x.split()[0] for x in f.readlines() if x.strip() ])
    for module in sorted(modules - existed):
        try:
            m = __import__(module)
            root = os.path.dirname(m.__file__)
        except:
            continue 
        print "Writing...", module
        print >>f, module, root

if __name__ == "__main__":
    main()

之后便可以方便的使用:BookmarkToRoot django:BookmarkToRoot tornado:BookmarkToRoot zope等来跳到模块目录了。