ledit.py
98 lines
| 3.0 KiB
| text/x-python
|
PythonLexer
Bernardo B. Marques
|
r4872 | """ Fun magic line editor for ipython | ||
vivainio
|
r503 | |||
Bernardo B. Marques
|
r4872 | Use this to easily edit lists of strings gradually without crafting long | ||
vivainio
|
r503 | list comprehensions. | ||
Bernardo B. Marques
|
r4872 | 'l' is the magic variable name for every line (array element). Save the current | ||
vivainio
|
r503 | 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 ) ... | ||||
""" | ||||
Brian Granger
|
r2027 | from IPython.core import ipapi | ||
vivainio
|
r503 | import pprint | ||
Brian Granger
|
r2027 | ip = ipapi.get() | ||
vivainio
|
r503 | |||
curdata = [] | ||||
def line_edit_f(self, cmd ): | ||||
global curdata | ||||
Bernardo B. Marques
|
r4872 | |||
vivainio
|
r503 | if not cmd: | ||
Bernardo B. Marques
|
r4872 | |||
vivainio
|
r503 | 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 | ||||
Bernardo B. Marques
|
r4872 | |||
vivainio
|
r503 | if cmd == 's': | ||
curdata = ip.ev('_') | ||||
print "Data set from last result (_)" | ||||
newlines = curdata | ||||
Bernardo B. Marques
|
r4872 | |||
vivainio
|
r503 | 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) | ||||
Matthias BUSSONNIER
|
r7787 | except Exception as e: | ||
vivainio
|
r503 | print "Dropping exception",e,"on line:",l | ||
continue | ||||
newlines.append(l2) | ||||
Bernardo B. Marques
|
r4872 | |||
vivainio
|
r503 | 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('')] | ||||
Bernardo B. Marques
|
r4872 | |||
vivainio
|
r503 | return dir('') + ['l.' + func for func in dir('')] | ||
ip.set_hook('complete_command', line_edit_complete_f , str_key = '%led') | ||||
Bernardo B. Marques
|
r4872 | |||
Matthias BUSSONNIER
|
r7787 | ip.define_magic('led', line_edit_f) | ||