Skip to content

Commit 9f4020a

Browse files
committed
Ticket #4751: mcedit: fix regex replacement in selection.
Replace replacement in selection unexpectedly replaces EOL of last line. * (edit_search_fix_search_start_if_selection): fix search start position. * (edit_find): fix start and finish postitions of search. Update bottom marker of selection. Add condition of end of search. Continuation of #4072. Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
1 parent 5c0833b commit 9f4020a

1 file changed

Lines changed: 21 additions & 20 deletions

File tree

src/editor/editsearch.c

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -276,19 +276,8 @@ edit_search_fix_search_start_if_selection (WEdit *edit)
276276
if (!edit_search_options.only_in_selection)
277277
return;
278278

279-
if (!eval_marks (edit, &start_mark, &end_mark))
280-
return;
281-
282-
if (edit_search_options.backwards)
283-
{
284-
if (edit->search_start > end_mark || edit->search_start <= start_mark)
285-
edit->search_start = end_mark;
286-
}
287-
else
288-
{
289-
if (edit->search_start < start_mark || edit->search_start >= end_mark)
290-
edit->search_start = start_mark;
291-
}
279+
if (eval_marks (edit, &start_mark, &end_mark))
280+
edit->search_start = edit_search_options.backwards ? end_mark : start_mark;
292281
}
293282

294283
/* --------------------------------------------------------------------------------------------- */
@@ -323,20 +312,15 @@ edit_find (edit_search_status_msg_t *esm, gsize *len)
323312
const off_t bol =
324313
edit_calculate_start_of_current_line (buf, search_start, end_string_symbol);
325314

326-
if (search_start != bol)
327-
{
328-
start_mark = edit_calculate_start_of_next_line (buf, start_mark, buf->size,
329-
end_string_symbol);
330-
start_from_next_line = TRUE;
331-
}
315+
start_from_next_line = search_start != bol;
332316
}
333317

334318
if ((edit->search_line_type & MC_SEARCH_LINE_END) != 0
335319
&& (end_mark - 1 != buf->size
336320
|| edit_buffer_get_byte (buf, end_mark) != end_string_symbol))
337321
end_mark = edit_calculate_end_of_previous_line (buf, end_mark, end_string_symbol);
338322

339-
if (start_mark >= end_mark)
323+
if (search_start >= end_mark)
340324
{
341325
mc_search_set_error (edit->search, MC_SEARCH_E_NOTFOUND, "%s", _ (STR_E_NOTFOUND));
342326
return FALSE;
@@ -396,12 +380,29 @@ edit_find (edit_search_status_msg_t *esm, gsize *len)
396380

397381
// correct end_mark if cursor is in column 0: move end_mark to the end of previous line
398382
if (end_mark == edit_calculate_start_of_current_line (buf, end_mark, end_string_symbol))
383+
{
399384
end_mark = edit_calculate_end_of_previous_line (buf, end_mark, end_string_symbol);
400385

386+
// update bottom marker
387+
if (edit->mark2 >= 0 && edit->mark2 != edit->mark1)
388+
{
389+
if (edit->mark2 > edit->mark1)
390+
edit->mark2 = end_mark;
391+
else
392+
edit->mark1 = end_mark;
393+
}
394+
}
395+
401396
if (start_from_next_line)
402397
search_start =
403398
edit_calculate_start_of_next_line (buf, search_start, end_mark, end_string_symbol);
404399

400+
if (search_start >= end_mark)
401+
{
402+
mc_search_set_error (edit->search, MC_SEARCH_E_NOTFOUND, "%s", _ (STR_E_NOTFOUND));
403+
return FALSE;
404+
}
405+
405406
return mc_search_run (edit->search, (void *) esm, search_start, end_mark, len);
406407
}
407408

0 commit comments

Comments
 (0)