@@ -613,14 +613,39 @@ bool TabWidget::replaceRange(const QString &fileName, const dpfservice::Edit::Ra
613613 if (auto editor = d->findEditor (fileName)) {
614614 // When using the `lineLength()` function to get the length, it is calculated in bytes.
615615 // When there are Chinese characters in the text, the length obtained is not correct.
616- int indexTo = range.end .column ;
617- if (indexTo == -1 ) {
618- auto lineText = editor->text (range.end .line );
619- indexTo = lineText.length ();
616+ auto lineLength = [editor](int line, bool rmN) {
617+ auto lineText = editor->text (line);
618+ int len = lineText.length ();
619+ if (rmN && lineText.endsWith (' \n ' ))
620+ len -= 1 ;
621+ return len;
622+ };
623+
624+ editor->beginUndoAction ();
625+ auto lineTextList = newText.split (' \n ' );
626+ for (int i = 0 ; i < lineTextList.size (); ++i) {
627+ int line = range.start .line + i;
628+ int indexFrom = 0 ;
629+ if (i == 0 )
630+ indexFrom = range.start .column == -1 ? 0 : range.start .column ;
631+ int indexTo = lineLength (line, true );
632+ if (line == range.end .line && indexTo != range.end .column )
633+ indexTo = range.end .column ;
634+
635+ if (i == lineTextList.size () - 1 || line == range.end .line ) {
636+ indexTo = range.end .column ;
637+ if (indexTo == -1 )
638+ indexTo = lineLength (range.end .line , false );
639+ QStringList remainderLines;
640+ std::copy (lineTextList.begin () + i, lineTextList.end (), std::back_inserter (remainderLines));
641+ editor->replaceRange (line, indexFrom, range.end .line , indexTo, remainderLines.join (' \n ' ));
642+ break ;
643+ } else {
644+ editor->replaceRange (line, indexFrom, line, indexTo, lineTextList[i]);
645+ }
620646 }
621647
622- editor->replaceRange (range.start .line , range.start .column == -1 ? 0 : range.start .column ,
623- range.end .line , indexTo, newText);
648+ editor->endUndoAction ();
624649 return true ;
625650 }
626651
0 commit comments