--- 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)