From 4851de4b4cd97afc0fb0d8a753d4c9d451c40d1f 2011-04-02 19:13:45 From: Thomas Kluyver Date: 2011-04-02 19:13:45 Subject: [PATCH] Improve readline resetter mechanism. --- diff --git a/IPython/core/interactiveshell.py b/IPython/core/interactiveshell.py index fc608b6..9866735 100644 --- a/IPython/core/interactiveshell.py +++ b/IPython/core/interactiveshell.py @@ -140,17 +140,29 @@ class ReadlineNoRecord(object): def __enter__(self): if self._nested_level == 0: + self.orig_length = self.current_length() self.readline_tail = self.get_readline_tail() self._nested_level += 1 def __exit__(self, type, value, traceback): self._nested_level -= 1 if self._nested_level == 0: - if self.get_readline_tail() != self.readline_tail: + # Try clipping the end if it's got longer + e = self.current_length() - self.orig_length + if e > 0: + for _ in range(e): + self.shell.readline.remove_history_item(self.orig_length) + + # If it still doesn't match, just reload readline history. + if self.current_length() != self.orig_length \ + or self.get_readline_tail() != self.readline_tail: self.shell.refill_readline_hist() # Returning False will cause exceptions to propagate return False - + + def current_length(self): + return self.shell.readline.get_current_history_length() + def get_readline_tail(self, n=10): """Get the last n items in readline history.""" end = self.shell.readline.get_current_history_length() + 1