bpo-26353: IDLE adds an unneeded newline when saving a shell window (GH-17103)

diff --git a/Lib/idlelib/iomenu.py b/Lib/idlelib/iomenu.py
index b5533be..4b2833b 100644
--- a/Lib/idlelib/iomenu.py
+++ b/Lib/idlelib/iomenu.py
@@ -371,10 +371,7 @@
         return "break"
 
     def writefile(self, filename):
-        self.fixlastline()
-        text = self.text.get("1.0", "end-1c")
-        if self.eol_convention != "\n":
-            text = text.replace("\n", self.eol_convention)
+        text = self.fixnewlines()
         chars = self.encode(text)
         try:
             with open(filename, "wb") as f:
@@ -387,6 +384,16 @@
                                    parent=self.text)
             return False
 
+    def fixnewlines(self):
+        "Return text with final \n if needed and os eols."
+        if (self.text.get("end-2c") != '\n'
+            and not hasattr(self.editwin, "interp")):  # Not shell.
+            self.text.insert("end-1c", "\n")
+        text = self.text.get("1.0", "end-1c")
+        if self.eol_convention != "\n":
+            text = text.replace("\n", self.eol_convention)
+        return text
+
     def encode(self, chars):
         if isinstance(chars, bytes):
             # This is either plain ASCII, or Tk was returning mixed-encoding
@@ -426,11 +433,6 @@
         # declared encoding
         return BOM_UTF8 + chars.encode("utf-8")
 
-    def fixlastline(self):
-        c = self.text.get("end-2c")
-        if c != '\n':
-            self.text.insert("end-1c", "\n")
-
     def print_window(self, event):
         confirm = tkMessageBox.askokcancel(
                   title="Print",