""" Fun magic line editor for ipython Use this to easily edit lists of strings gradually without crafting long list comprehensions. 'l' is the magic variable name for every line (array element). Save the current result (or more exactly, retrieve the last ipython computation result into %led work area) by running '%led s'. Just run '%led' to show the current work area data. Example use: [ipython]|25> setups = !ls *setup*.py == ['eggsetup.py', 'setup.py', 'setup_bdist_egg.py'] [ipython]|26> setups <26> ['eggsetup.py', 'setup.py', 'setup_bdist_egg.py'] [ipython]|27> %led s Data set from last result (_) <27> ['eggsetup.py', 'setup.py', 'setup_bdist_egg.py'] [ipython]|28> %led upper cmd translated => l.upper() <28> ['EGGSETUP.PY', 'SETUP.PY', 'SETUP_BDIST_EGG.PY'] [ipython]|29> %led Magic line editor (for lists of strings) current data is: ['eggsetup.py', 'setup.py', 'setup_bdist_egg.py'] [ipython]|30> %led upper cmd translated => l.upper() <30> ['EGGSETUP.PY', 'SETUP.PY', 'SETUP_BDIST_EGG.PY'] [ipython]|31> %led s Data set from last result (_) <31> ['EGGSETUP.PY', 'SETUP.PY', 'SETUP_BDIST_EGG.PY'] [ipython]|32> %led "n:" + l <32> ['n:EGGSETUP.PY', 'n:SETUP.PY', 'n:SETUP_BDIST_EGG.PY'] [ipython]|33> %led s Data set from last result (_) <33> ['n:EGGSETUP.PY', 'n:SETUP.PY', 'n:SETUP_BDIST_EGG.PY'] [ipython]|34> %led l. l.__add__ l.__gt__ l.__reduce_ex__ l.endswith l.join l.rstrip l.__class__ l.__hash__ l.__repr__ l.expandtabs l.ljust l.split ... (completions for string variable shown ) ... """ import IPython.ipapi import pprint ip = IPython.ipapi.get() curdata = [] def line_edit_f(self, cmd ): global curdata if not cmd: print "Magic line editor (for lists of strings)" if curdata: print "current data is:" pprint.pprint(curdata) else: print "No current data, you should set it by running '%led s'" print "When you have your data in _ (result of last computation)." return if cmd == 's': curdata = ip.ev('_') print "Data set from last result (_)" newlines = curdata else: # simple method call, e.g. upper if cmd.isalpha(): cmd = 'l.' + cmd + '()' print "cmd translated =>",cmd newlines = [] for l in curdata: try: l2 = eval(cmd) except Exception,e: print "Dropping exception",e,"on line:",l continue newlines.append(l2) return newlines def line_edit_complete_f(self,event): """ Show all string methods in completions """ if event.symbol.startswith('l.'): return ['l.' + func for func in dir('')] return dir('') + ['l.' + func for func in dir('')] ip.set_hook('complete_command', line_edit_complete_f , str_key = '%led') ip.expose_magic('led', line_edit_f)