# HG changeset patch # User Torsten Lilge # Date 1582464189 -3600 # Node ID 480490faf65904c20201ed302af6d7634db24478 # Parent baf16e6f498b866d1d62feeb1dd838cf5191bd45 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 diff -r baf16e6f498b -r 480490faf659 libgui/src/m-editor/file-editor-tab.cc --- 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 ();