pmacs3/mode/ipythonmini.py

121 lines
4.4 KiB
Python
Raw Permalink Normal View History

import code, re, string, io, sys
2008-05-26 23:57:09 -04:00
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()
candidates = b.completions(word)
2008-05-26 23:57:09 -04:00
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):
name = 'IpythonMini'
actions = [IpythonExec, IpythonTab, IpythonStart, IpythonPathStart,
IpythonPageUp, IpythonPageDown, IpythonGotoBeginning, IpythonGotoEnd]
2008-05-26 23:57:09 -04:00
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',))
2008-06-10 14:29:19 -04:00
self.add_bindings('console-cancel', ('C-]', 'C-g'))
2008-05-26 23:57:09 -04:00
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.ascii_letters + string.digits + string.punctuation:
2008-05-26 23:57:09 -04:00
self.add_binding('insert-string-%s' % c, c)
install = IpythonMini.install