[prev in list] [next in list] [prev in thread] [next in thread] 

List:       nano-devel
Subject:    Re: [Nano-devel] undoing replacings in a marked region goes wrong
From:       Benno Schulenberg <bensberg () justemail ! net>
Date:       2015-04-02 21:56:15
Message-ID: 1428011775.3538834.248748289.19A13355 () webmail ! messagingengine ! com
[Download RAW message or body]

It has to work for backwards replacing too.
And there's much stuff that is unneeded.
So the patch is getting pretty ugly by now.

I'll have to split it up in a patch that changes
the logic, and one that cleans up.  But for now,
this works for me.

Benno

-- 
http://www.fastmail.com - Same, same, but different...


["exit-when-outside-region.3.patch" (exit-when-outside-region.3.patch)]

Index: src/search.c
===================================================================
--- src/search.c	(revision 5172)
+++ src/search.c	(working copy)
@@ -692,25 +692,24 @@
 #endif
 #ifndef NANO_TINY
     bool old_mark_set = openfile->mark_set;
-    filestruct *edittop_save = openfile->edittop, *top, *bot;
+    filestruct *top, *bot;
     size_t top_x, bot_x;
     bool right_side_up = FALSE;
 	/* TRUE if (mark_begin, mark_begin_x) is the top of the mark,
 	 * FALSE if (current, current_x) is. */
 
     if (old_mark_set) {
-	/* If the mark is on, partition the filestruct so that it
-	 * contains only the marked text, set edittop to the top of the
-	 * partition, turn the mark off, and refresh the screen. */
+	/* If the mark is on, frame the region, and turn the mark off. */
 	mark_order((const filestruct **)&top, &top_x,
 	    (const filestruct **)&bot, &bot_x, &right_side_up);
-	filepart = partition_filestruct(top, top_x, bot, bot_x);
-	openfile->edittop = openfile->fileage;
 	openfile->mark_set = FALSE;
-#ifndef DISABLE_COLOR
-	reset_multis(openfile->current, TRUE);
-#endif
-	edit_refresh();
+	if (!ISSET(BACKWARDS_SEARCH)) {
+	    openfile->current = top;
+	    openfile->current_x = (top_x == 0 ? 0 : top_x - 1);
+	} else {
+	    openfile->current = bot;
+	    openfile->current_x = bot_x;
+	}
     }
 #endif /* !NANO_TINY */
 
@@ -734,6 +733,16 @@
 	, real_current, *real_current_x, needle, &match_len)) {
 	int i = 0;
 
+#ifndef NANO_TINY
+	if (old_mark_set) {
+	    if (openfile->current->lineno > bot->lineno ||
+		openfile->current->lineno < top->lineno ||
+		(openfile->current == bot && openfile->current_x > *real_current_x) ||
+		(openfile->current == top && openfile->current_x < top_x))
+		break;
+	}
+#endif
+
 #ifdef HAVE_REGEX_H
 	/* If the bol_or_eol flag is set, we've found a match on the
 	 * beginning line already, and we're still on the beginning line
@@ -794,7 +803,7 @@
 	    size_t length_change;
 
 #ifndef NANO_TINY
-	    update_undo(REPLACE);
+	    add_undo(REPLACE);
 #endif
 	    if (i == 2)
 		replaceall = TRUE;
@@ -849,7 +858,8 @@
 	    openfile->current->data = copy;
 
 #ifndef DISABLE_COLOR
-	    reset_multis(openfile->current, TRUE);
+	    if (numreplaced == 0)
+		reset_multis(openfile->current, TRUE);
 #endif
 
 	    if (!replaceall) {
@@ -869,22 +879,14 @@
 	}
     }
 
+    if (numreplaced == -1)
+	not_found_msg(needle);
+
 #ifndef NANO_TINY
-    if (old_mark_set) {
-	/* If the mark was on, unpartition the filestruct so that it
-	 * contains all the text again, set edittop back to what it was
-	 * before, turn the mark back on, and refresh the screen. */
-	unpartition_filestruct(&filepart);
-	openfile->edittop = edittop_save;
+    if (old_mark_set)
 	openfile->mark_set = TRUE;
-    }
 #endif
 
-    /* If the NO_NEWLINES flag isn't set, and text has been added to the
-     * magicline, make a new magicline. */
-    if (!ISSET(NO_NEWLINES) && openfile->filebot->data[0] != '\0')
-	new_magicline();
-
     return numreplaced;
 }
 


_______________________________________________
Nano-devel mailing list
Nano-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/nano-devel


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic