--- PyShell.py.orig 2008-05-04 17:30:43.000000000 -0500
+++ PyShell.py 2008-06-16 19:54:07.000000000 -0500
@@ -303,13 +303,18 @@
})
class ModifiedUndoDelegator(UndoDelegator):
- "Extend base class: forbid insert/delete before the I/O mark"
-
+ "Extend base class: redirects insert/delete to the end mark"
+
def insert(self, index, chars, tags=None):
try:
- if self.delegate.compare(index, "<", "iomark"):
- self.delegate.bell()
- return
+ if self.delegate.compare(index, "<", "iomark"):
+ try: # improved behavior
+ text = self.delegate.delegate.delegate
+ text.mark_set("insert", "end-1c")
+ except: # on error, default to old behavior
+ self.delegate.bell()
+ return
+
except TclError:
pass
UndoDelegator.insert(self, index, chars, tags)
@@ -828,6 +833,12 @@
text.bind("<>", self.open_stack_viewer)
text.bind("<>", self.toggle_debugger)
text.bind("<>", self.toggle_jit_stack_viewer)
+
+ text.bind("<>", self.key_up_callback);
+ text.bind("<>", self.key_down_callback);
+ text.event_add("<>", "");
+ text.event_add("<>", "");
+
if use_subprocess:
text.bind("<>", self.view_restart_mark)
text.bind("<>", self.restart_shell)
@@ -848,6 +859,89 @@
#
self.pollinterval = 50 # millisec
+
+ def history_ismember(self):
+ """ if the current input is in the history, return true """
+
+ # this function should be in IdleHistory.py - RDS
+ s = self.history._get_source('iomark', 'end-1c')
+ for i in self.history.history:
+ if i == s:
+ return True
+
+ return False
+
+ def key_up_callback(self, event):
+
+ if self.text.compare('insert', '>=', 'iomark'):
+ # cursor inside current input
+ s = self.text.get('iomark', 'end-1c')
+
+ if s.find('\n') == -1:
+ # single line input
+
+ if self.text.compare('insert', '==', 'end-1c'):
+ self.history.history_prev(event)
+ return "break"
+ else:
+ self.text.mark_set('insert', 'end-1c')
+ return "break"
+
+ else:
+ # multiline input
+
+ if self.text.compare('insert linestart-1c', '==', \
+ 'iomark lineend'):
+ # correction in cursor placement due to ">>>"
+ line,column = self.text.index(INSERT).split('.')
+ column = int(column) + (len(sys.ps1) - 1)
+ self.text.mark_set("insert", "%s.%d" % (line, column))
+
+ if self.text.compare('insert', '==', 'end-1c'):
+ if self.history_ismember() == True:
+ self.history.history_prev(event)
+ return "break"
+
+ elif self.text.compare('insert linestart', '<=', 'iomark'):
+ # don't leave the input area
+ return "break"
+
+
+ def key_down_callback(self, event):
+
+ if self.text.compare('insert', '>=', 'iomark'):
+ # cursor inside current input
+ s = self.text.get('iomark', 'end-1c')
+
+ if s.find('\n') == -1:
+ # single line input
+
+ if self.text.compare('insert', '==', 'end-1c'):
+ self.history.history_next(event)
+ return "break"
+ else:
+ self.text.mark_set('insert', 'end-1c')
+ return "break"
+
+ else:
+ # multiline input
+
+ if self.text.compare('insert linestart', '==', \
+ 'iomark linestart'):
+ # correction in cursor placement due to ">>>"
+ line,column = self.text.index(INSERT).split('.')
+ column = int(column) - (len(sys.ps1) - 1)
+ if column < 1:
+ column = 1
+ self.text.mark_set("insert", "%s.%d" % (line, column))
+
+ if self.history_ismember() == True:
+ if self.text.compare('insert', '==', 'end-1c'):
+ self.history.history_next(event)
+ return "break"
+ elif self.text.compare('insert lineend', '==', 'end-1c'):
+ return "break"
+
def get_standard_extension_names(self):
return idleConf.GetExtensions(shell_only=True)