New feature: when saving a file, keep the eol convention of the
original.  New files are written using the eol convention of the
platform, given by os.linesep.  All files are read and written in
binary mode.
diff --git a/Lib/idlelib/IOBinding.py b/Lib/idlelib/IOBinding.py
index d321d8c..6f46a60 100644
--- a/Lib/idlelib/IOBinding.py
+++ b/Lib/idlelib/IOBinding.py
@@ -178,6 +178,10 @@
             self.text.focus_set()
         return "break"
 
+    eol = r"(\r\n)|\n|\r"  # \r\n (Windows), \n (UNIX), or \r (Mac)
+    eol_re = re.compile(eol)
+    eol_convention = os.linesep # Default
+
     def loadfile(self, filename):
         try:
             # open the file in binary mode so that we can handle
@@ -191,8 +195,10 @@
 
         chars = self.decode(chars)
         # We now convert all end-of-lines to '\n's
-        eol = r"(\r\n)|\n|\r"  # \r\n (Windows), \n (UNIX), or \r (Mac)
-        chars = re.compile( eol ).sub( r"\n", chars )
+        firsteol = self.eol_re.search(chars)
+        if firsteol:
+            self.eol_convention = firsteol.group(0)
+            chars = self.eol_re.sub(r"\n", chars)
 
         self.text.delete("1.0", "end")
         self.set_filename(None)
@@ -306,8 +312,10 @@
     def writefile(self, filename):
         self.fixlastline()
         chars = self.encode(self.text.get("1.0", "end-1c"))
+        if self.eol_convention != "\n":
+            chars = chars.replace("\n", self.eol_convention)
         try:
-            f = open(filename, "w")
+            f = open(filename, "wb")
             f.write(chars)
             f.close()
             return True