#!/usr/bin/env python """ To make it work, you need to execute (ie push in .bashrc) complete -o bashdefault -o default -C trial blame bash """ import os, sys, types def current_dir(prefix=''): all = [] for name in os.listdir('.'): if name.startswith(prefix): all.append(name) if len(all) == 1: print all[0] + '.' for i in all: print i def try_getattr(parts): so_far = [parts[0]] mod = __import__(parts[0], locals(), globals(), []) for part in parts[1:-1]: next = getattr(mod, part, None) if next is None and isinstance(mod, types.ModuleType): try: so_far.append(part) mod = __import__('.'.join(so_far), locals(), globals(), ['*']) except ImportError: return # give up else: mod = next all = [] for i in mod.__dict__: if i.startswith(parts[1]): all.append(i) # also try importing maybe for name in os.listdir(os.path.dirname(mod.__file__)): if name.startswith(parts[1]): try: print >>sys.stderr, so_far, name __import__('.'.join(so_far + [name]), locals(), globals(), []) all.append(name) except ImportError: pass for a in all: print ".".join(so_far + [a]) def process_parts(parts): if not parts: current_dir() elif len(parts) == 1: current_dir(parts[0]) else: try_getattr(parts) if __name__ == '__main__': line = os.environ['COMP_LINE'] cursorpos = int(os.environ['COMP_POINT']) lines = line[:cursorpos].split(" ") first = lines[0] if not first.endswith('trial'): sys.exit(0) sys.path.insert(0, os.path.dirname(os.path.abspath(first))) parts = lines[1].split(".") process_parts(lines[1].split("."))