]> granicus.if.org Git - python/commitdiff
Retrieval of previous shell command was not always preserving indentation
authorKurt B. Kaiser <kbk@shore.net>
Thu, 10 Aug 2006 17:11:09 +0000 (17:11 +0000)
committerKurt B. Kaiser <kbk@shore.net>
Thu, 10 Aug 2006 17:11:09 +0000 (17:11 +0000)
since 1.2a1) Patch 1528468 Tal Einat.

Lib/idlelib/NEWS.txt
Lib/idlelib/PyShell.py

index 235963e93f57172eaec7e6d6fede6d3e36ff0dba..5982396b7b6935f14d1a260ed819b468ac9e468f 100644 (file)
@@ -3,6 +3,9 @@ What's New in IDLE 1.2c1?
 
 *Release date: XX-AUG-2006*
 
+- Retrieval of previous shell command was not always preserving indentation
+  (since 1.2a1) Patch 1528468 Tal Einat.
+
 - Changing tokenize (39046) to detect dedent broke tabnanny check (since 1.2a1)
 
 - ToggleTab dialog was setting indent to 8 even if cancelled (since 1.2a1).
index c0bd5d0d6b95dccd8c0c20e609027ef34af03a65..12a45a4503d9177c866d0ce61c5ea6f40914189c 100644 (file)
@@ -593,7 +593,7 @@ class ModifiedInterpreter(InteractiveInterpreter):
                 source = source.encode(IOBinding.encoding)
             except UnicodeError:
                 self.tkconsole.resetoutput()
-                self.write("Unsupported characters in input")
+                self.write("Unsupported characters in input\n")
                 return
         try:
             # InteractiveInterpreter.runsource() calls its runcode() method,
@@ -1138,21 +1138,27 @@ class PyShell(OutputWindow):
         return "break"
 
     def recall(self, s, event):
+        # remove leading and trailing empty or whitespace lines
+        s = re.sub(r'^\s*\n', '' , s)
+        s = re.sub(r'\n\s*$', '', s)
+        lines = s.split('\n')
         self.text.undo_block_start()
         try:
             self.text.tag_remove("sel", "1.0", "end")
             self.text.mark_set("insert", "end-1c")
-            s = s.strip()
-            lines = s.split('\n')
-            prefix = self.text.get("insert linestart","insert").rstrip()
-            if prefix and prefix[-1]==':':
+            prefix = self.text.get("insert linestart", "insert")
+            if prefix.rstrip().endswith(':'):
                 self.newline_and_indent_event(event)
-            self.text.insert("insert",lines[0].strip())
+                prefix = self.text.get("insert linestart", "insert")
+            self.text.insert("insert", lines[0].strip())
             if len(lines) > 1:
-                self.newline_and_indent_event(event)
+                orig_base_indent = re.search(r'^([ \t]*)', lines[0]).group(0)
+                new_base_indent  = re.search(r'^([ \t]*)', prefix).group(0)
                 for line in lines[1:]:
-                    self.text.insert("insert", line.strip())
-                    self.newline_and_indent_event(event)
+                    if line.startswith(orig_base_indent):
+                        # replace orig base indentation with new indentation
+                        line = new_base_indent + line[len(orig_base_indent):]
+                    self.text.insert('insert', '\n'+line.rstrip())
         finally:
             self.text.see("insert")
             self.text.undo_block_stop()