changeset 28134:480490faf659

change behavior for handling newline at end of file (bug #57861) * file-editor-tab.cc (load_file): remove possible newline at end of file if a newline is added while saving; (do_save_file): always add a newline to the saved file if related user preference is set, remove trailing spaces in last line only if the related pref is set
author Torsten Lilge <ttl-octave@mailbox.org>
date Sun, 23 Feb 2020 14:23:09 +0100
parents baf16e6f498b
children 7818c5b07403
files libgui/src/m-editor/file-editor-tab.cc
diffstat 1 files changed, 30 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/src/m-editor/file-editor-tab.cc	Sat Feb 22 17:26:34 2020 +0100
+++ b/libgui/src/m-editor/file-editor-tab.cc	Sun Feb 23 14:23:09 2020 +0100
@@ -1833,7 +1833,23 @@
     QApplication::setOverrideCursor (Qt::WaitCursor);
 
     // read the file binary, decoding later
-    const QByteArray text_data = file.readAll ();
+    QByteArray text_data = file.readAll ();
+
+    // remove newline at end of file if we add one again when saving
+    resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
+    gui_settings *settings = rmgr.get_settings ();
+
+    if (settings->value (ed_force_newline).toBool ())
+      {
+        const QByteArray eol_lf = QByteArray (1,0x0a);
+        const QByteArray eol_cr = QByteArray (1,0x0d);
+
+        if (text_data.endsWith (eol_lf))
+          text_data.chop (1);   // remove LF
+
+        if (text_data.endsWith (eol_cr)) // remove CR (altogether CRLF, too)
+          text_data.chop (1);
+      }
 
     // decode
     QTextCodec::ConverterState st;
@@ -2270,16 +2286,11 @@
     if (! codec)
       return;   // No valid codec
 
-    // Remove trailing white spaces and force file ending with
-    // a newline if desired
-
+    // Remove trailing white spaces if desired
     resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
     gui_settings *settings = rmgr.get_settings ();
 
-    bool rm_trailing_space = settings->value (ed_rm_trailing_spaces).toBool ();
-    bool force_newline = settings->value (ed_force_newline).toBool ();
-
-    if (rm_trailing_space || force_newline)
+    if (settings->value (ed_rm_trailing_spaces).toBool ())
       {
         int line, col;
         m_edit_area->getCursorPosition (&line,&col);
@@ -2287,26 +2298,23 @@
         QString eol = eol_string ();
         QString edit_text = m_edit_area->text ();
 
-        if (rm_trailing_space)
-          edit_text.replace (QRegExp ("[\\t ]+" + eol), eol);
-
-        if (force_newline)
-          {
-            int last_non_white_space = edit_text.lastIndexOf (QRegExp ("\\S"));
-            edit_text.chop (edit_text.length () - last_non_white_space - 1);
-            edit_text.append (eol);
-          }
-
-          m_edit_area->setText (edit_text);
-
-          m_edit_area->setCursorPosition (line,col);
-        }
+        edit_text.replace (QRegExp ("[\\t ]+" + eol), eol);  // All lines
+        long int idx = edit_text.lastIndexOf (QRegExp ("[^\\t^ ]"));
+        edit_text.chop (edit_text.length () - idx - 1); // Last line
+
+        m_edit_area->setText (edit_text);
+        m_edit_area->setCursorPosition (line,col);
+      }
 
     // Save the file
     out.setCodec (codec);
 
     QApplication::setOverrideCursor (Qt::WaitCursor);
+
     out << m_edit_area->text ();
+    if (settings->value (ed_force_newline).toBool ())
+      out << eol_string ();   // Add newline if desired
+
     out.flush ();
     QApplication::restoreOverrideCursor ();
     file.flush ();