#!/usr/bin/python import os, re, string, subprocess, sys _null_trans = string.maketrans("", "") text_characters = "".join(map(chr, range(32, 127)) + list("\n\r\t\b")) def use(): print """ use: %s [-h][-a [regex1 regex2 ...]] -a - include hidden files Select a file to edit using regular expressions. Files must match each regex. Directories and binary files are excluded. If a single file matches, open it vith %s, else select from matches. """ % (os.path.basename(sys.argv[0]),os.getenv('EDITOR')) def isbin(filename, blocksize=512): f = open(filename) f = f.read(blocksize) if f: t = f.translate(_null_trans, text_characters) if "\0" in f or len(t)/len(f) > 0.30: return 1 def getfiles(optall,optbin): for item in os.listdir('.'): if (os.path.isfile(item) and (optall or not item.startswith('.')) and (optbin or not isbin(item))): yield item def choose(argv, optall=0, optbin=0): for n, opt in enumerate(argv): if opt == "-h": use() sys.exit() elif opt == "-a": del argv[n] optall = 1 elif opt == "--": del argv[n] break files = [] for fn in getfiles(optall,optbin): if all(re.search(r,fn) for r in argv): files.append(fn) if len(files) == 0: return elif len(files) == 1: return files[0] else: for n, fn in enumerate(files): print "%3d %-20s" % (n + 1, fn) name = raw_input(" > ") if name == "": return try: return files[int(name) - 1] except: return name def main(): try: name = choose(sys.argv[1:]) subprocess.Popen([os.getenv('EDITOR'),name]).wait() except: print if __name__ == "__main__": main()