2008-05-26 23:57:09 -04:00
|
|
|
import code, re, string, StringIO, sys
|
|
|
|
import buffer, color, completer, lex, method, mode, mode.mini, mode.consolemini, window
|
|
|
|
from subprocess import Popen, PIPE, STDOUT
|
|
|
|
from mode.python import PythonGrammar
|
|
|
|
from point import Point
|
|
|
|
|
|
|
|
class IpythonExec(method.Method):
|
|
|
|
def _execute(self, w, **vargs):
|
|
|
|
if w.application.completion_window_is_open():
|
|
|
|
w.application.close_completion_buffer()
|
|
|
|
s = w.buffer.make_string()
|
|
|
|
w.mode.history[-1] = s
|
|
|
|
w.mode.history.append('')
|
|
|
|
w.buffer.set_data('')
|
|
|
|
w.mode.hindex = len(w.mode.history) - 1
|
|
|
|
|
|
|
|
b = w.mode.get_ipython()
|
|
|
|
a = w.application
|
|
|
|
if a.window().buffer is not b:
|
|
|
|
a.switch_buffer(b)
|
|
|
|
p = a.get_mini_buffer_prompt()
|
|
|
|
b.insert_string(b.get_buffer_end(), p + s + '\n', force=True)
|
|
|
|
|
|
|
|
b.pipe_write("ENTER:%s" % s)
|
|
|
|
w.mode.read_sync()
|
|
|
|
|
|
|
|
class IpythonTab(method.Method):
|
|
|
|
def execute(self, w, **vargs):
|
|
|
|
a = w.application
|
|
|
|
s = w.buffer.make_string()
|
|
|
|
|
|
|
|
x2 = w.logical_cursor().x
|
|
|
|
if not s or s[:x2].isspace():
|
|
|
|
w.insert_string_at_cursor(' ' * w.mode.tabwidth)
|
|
|
|
return
|
|
|
|
|
|
|
|
r = re.compile('^[a-zA-Z0-9_.]$')
|
|
|
|
line = s
|
|
|
|
x1 = x2
|
|
|
|
while x1 > 0 and r.match(s[x1 - 1]):
|
|
|
|
x1 -= 1
|
|
|
|
word = line[x1:x2]
|
|
|
|
|
|
|
|
b = w.mode.get_ipython()
|
|
|
|
b.pipe_write("COMPLETE:%s" % word)
|
|
|
|
candidates = b.pipe_read_completions()
|
|
|
|
w.mode.read_sync()
|
|
|
|
|
|
|
|
if candidates:
|
|
|
|
s = completer.find_common_string(candidates)
|
|
|
|
w.buffer.delete(Point(x1, 0), Point(x2, 0), force=True)
|
|
|
|
w.insert_string_at_cursor(s)
|
|
|
|
mode.mini.use_completion_window(a, s, candidates)
|
|
|
|
elif a.completion_window_is_open():
|
|
|
|
a.close_completion_buffer()
|
|
|
|
|
|
|
|
class IpythonPathStart(method.Method):
|
2008-05-28 14:58:55 -04:00
|
|
|
'''Interactively run python statements in the context of a buffer'''
|
|
|
|
def _start(self, w, parent):
|
2008-05-26 23:57:09 -04:00
|
|
|
a = w.application
|
|
|
|
if w.buffer.btype == 'ipython':
|
|
|
|
b = w.buffer
|
|
|
|
else:
|
2008-05-28 14:58:55 -04:00
|
|
|
name = buffer.IpythonBuffer.create_name(parent)
|
2008-05-26 23:57:09 -04:00
|
|
|
if not a.has_buffer_name(name):
|
2008-05-28 14:58:55 -04:00
|
|
|
b = buffer.IpythonBuffer(parent, a)
|
2008-05-26 23:57:09 -04:00
|
|
|
a.add_buffer(b)
|
|
|
|
window.Window(b, a)
|
|
|
|
else:
|
|
|
|
b = a.get_buffer_by_name(name)
|
|
|
|
self.main_buffer = b
|
|
|
|
if a.window().buffer is not b:
|
|
|
|
a.switch_buffer(b)
|
|
|
|
f = lambda x: None
|
|
|
|
w.application.open_mini_buffer('*** ', f, self, None, 'ipythonmini')
|
2008-05-28 14:58:55 -04:00
|
|
|
def execute(self, w, **vargs):
|
|
|
|
self._start(w, w.buffer)
|
|
|
|
|
|
|
|
class IpythonStart(IpythonPathStart):
|
|
|
|
'''Interactively run python statements'''
|
|
|
|
def execute(self, w, **vargs):
|
|
|
|
self._start(w, None)
|
2008-05-26 23:57:09 -04:00
|
|
|
|
|
|
|
class IpythonPageUp(mode.consolemini.ConsolePageUp):
|
|
|
|
subbuf = '*IPython*'
|
|
|
|
class IpythonPageDown(mode.consolemini.ConsolePageDown):
|
|
|
|
subbuf = '*IPython*'
|
|
|
|
class IpythonGotoBeginning(mode.consolemini.ConsoleGotoBeginning):
|
|
|
|
subbuf = '*IPython*'
|
|
|
|
class IpythonGotoEnd(mode.consolemini.ConsoleGotoEnd):
|
|
|
|
subbuf = '*IPython*'
|
|
|
|
|
|
|
|
class IpythonMini(mode.Fundamental):
|
|
|
|
modename = 'IpythonMini'
|
|
|
|
actions = [IpythonExec, IpythonTab, IpythonStart, IpythonPathStart,
|
|
|
|
IpythonPageUp, IpythonPageDown, IpythonGotoBeginning, IpythonGotoEnd]
|
|
|
|
def get_ipython(self):
|
|
|
|
return self.window.buffer.method.main_buffer
|
|
|
|
def read_sync(self):
|
|
|
|
b = self.get_ipython()
|
|
|
|
b.pipe_read()
|
|
|
|
self.window.application.set_mini_buffer_prompt(b.prompt)
|
|
|
|
def __init__(self, w):
|
|
|
|
mode.Fundamental.__init__(self, w)
|
|
|
|
self.history = ['']
|
|
|
|
self.hindex = 0
|
|
|
|
b = self.window.buffer.method.main_buffer
|
|
|
|
assert hasattr(b, 'pipe')
|
|
|
|
self.window.application.set_mini_buffer_prompt(b.prompt)
|
|
|
|
self.add_bindings('ipython-exec', ('RETURN',))
|
|
|
|
self.add_bindings('console-clear', ('C-l',))
|
|
|
|
self.add_bindings('console-cancel', ('C-]',))
|
|
|
|
self.add_bindings('console-history-prev', ('C-p', 'UP'))
|
|
|
|
self.add_bindings('console-history-next', ('C-n', 'DOWN'))
|
|
|
|
self.add_bindings('ipython-tab', ('TAB',))
|
|
|
|
self.add_bindings('ipython-page-up', ('M-v',))
|
|
|
|
self.add_bindings('ipython-page-down', ('C-v',))
|
|
|
|
self.add_bindings('ipython-goto-beginning', ('M-<',))
|
|
|
|
self.add_bindings('ipython-goto-end', ('M->',))
|
|
|
|
for c in string.letters + string.digits + string.punctuation:
|
|
|
|
self.add_binding('insert-string-%s' % c, c)
|
|
|
|
|
|
|
|
install = IpythonMini.install
|