Merge #7262 'inccommand': fix 'gdefault' lockup
This commit is contained in:
commit
1551f71321
|
@ -3665,6 +3665,42 @@ static buf_T *do_sub(exarg_T *eap, proftime_T timeout)
|
|||
* use "\=col("."). */
|
||||
curwin->w_cursor.col = regmatch.startpos[0].col;
|
||||
|
||||
// When the match included the "$" of the last line it may
|
||||
// go beyond the last line of the buffer.
|
||||
if (nmatch > curbuf->b_ml.ml_line_count - sub_firstlnum + 1) {
|
||||
nmatch = curbuf->b_ml.ml_line_count - sub_firstlnum + 1;
|
||||
skip_match = true;
|
||||
}
|
||||
|
||||
#define ADJUST_SUB_FIRSTLNUM() \
|
||||
do { \
|
||||
/* For a multi-line match, make a copy of the last matched */ \
|
||||
/* line and continue in that one. */ \
|
||||
if (nmatch > 1) { \
|
||||
sub_firstlnum += nmatch - 1; \
|
||||
xfree(sub_firstline); \
|
||||
sub_firstline = vim_strsave(ml_get(sub_firstlnum)); \
|
||||
/* When going beyond the last line, stop substituting. */ \
|
||||
if (sub_firstlnum <= line2) { \
|
||||
do_again = true; \
|
||||
} else { \
|
||||
subflags.do_all = false; \
|
||||
} \
|
||||
} \
|
||||
if (skip_match) { \
|
||||
/* Already hit end of the buffer, sub_firstlnum is one */ \
|
||||
/* less than what it ought to be. */ \
|
||||
xfree(sub_firstline); \
|
||||
sub_firstline = vim_strsave((char_u *)""); \
|
||||
copycol = 0; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
if (preview && !has_second_delim) {
|
||||
ADJUST_SUB_FIRSTLNUM();
|
||||
goto skip;
|
||||
}
|
||||
|
||||
// 3. Substitute the string. During 'inccommand' preview only do this if
|
||||
// there is a replace pattern.
|
||||
if (!preview || has_second_delim) {
|
||||
|
@ -3691,13 +3727,6 @@ static buf_T *do_sub(exarg_T *eap, proftime_T timeout)
|
|||
goto skip;
|
||||
}
|
||||
|
||||
// When the match included the "$" of the last line it may
|
||||
// go beyond the last line of the buffer.
|
||||
if (nmatch > curbuf->b_ml.ml_line_count - sub_firstlnum + 1) {
|
||||
nmatch = curbuf->b_ml.ml_line_count - sub_firstlnum + 1;
|
||||
skip_match = true;
|
||||
}
|
||||
|
||||
// Need room for:
|
||||
// - result so far in new_start (not for first sub in line)
|
||||
// - original text up to match
|
||||
|
@ -3728,30 +3757,10 @@ static buf_T *do_sub(exarg_T *eap, proftime_T timeout)
|
|||
// is beyond the end of the line after the substitution.
|
||||
curwin->w_cursor.col = 0;
|
||||
|
||||
// For a multi-line match, make a copy of the last matched
|
||||
// line and continue in that one.
|
||||
if (nmatch > 1) {
|
||||
sub_firstlnum += nmatch - 1;
|
||||
xfree(sub_firstline);
|
||||
sub_firstline = vim_strsave(ml_get(sub_firstlnum));
|
||||
// When going beyond the last line, stop substituting.
|
||||
if (sub_firstlnum <= line2) {
|
||||
do_again = true;
|
||||
} else {
|
||||
subflags.do_all = false;
|
||||
}
|
||||
}
|
||||
|
||||
// Remember next character to be copied.
|
||||
copycol = regmatch.endpos[0].col;
|
||||
|
||||
if (skip_match) {
|
||||
// Already hit end of the buffer, sub_firstlnum is one
|
||||
// less than what it ought to be.
|
||||
xfree(sub_firstline);
|
||||
sub_firstline = vim_strsave((char_u *)"");
|
||||
copycol = 0;
|
||||
}
|
||||
ADJUST_SUB_FIRSTLNUM();
|
||||
|
||||
// Now the trick is to replace CTRL-M chars with a real line
|
||||
// break. This would make it impossible to insert a CTRL-M in
|
||||
|
@ -4008,6 +4017,7 @@ skip:
|
|||
kv_destroy(matched_lines);
|
||||
|
||||
return preview_buf;
|
||||
#undef ADJUST_SUB_FIRSTLNUM
|
||||
} // NOLINT(readability/fn_size)
|
||||
|
||||
/*
|
||||
|
|
|
@ -14,6 +14,7 @@ local neq = helpers.neq
|
|||
local ok = helpers.ok
|
||||
local source = helpers.source
|
||||
local wait = helpers.wait
|
||||
local nvim = helpers.nvim
|
||||
|
||||
local default_text = [[
|
||||
Inc substitution on
|
||||
|
@ -1647,3 +1648,29 @@ describe("'inccommand' split windows", function()
|
|||
end)
|
||||
|
||||
end)
|
||||
|
||||
describe("'inccommand' with 'gdefault'", function()
|
||||
before_each(function()
|
||||
clear()
|
||||
end)
|
||||
|
||||
it("does not lock up #7244", function()
|
||||
common_setup(nil, "nosplit", "{")
|
||||
command("set gdefault")
|
||||
feed(":s/{\\n")
|
||||
eq({mode='c', blocking=false}, nvim("get_mode"))
|
||||
feed("/A<Enter>")
|
||||
expect("A")
|
||||
eq({mode='n', blocking=false}, nvim("get_mode"))
|
||||
end)
|
||||
|
||||
it("with multiline text and range, does not lock up #7244", function()
|
||||
common_setup(nil, "nosplit", "{\n\n{")
|
||||
command("set gdefault")
|
||||
feed(":%s/{\\n")
|
||||
eq({mode='c', blocking=false}, nvim("get_mode"))
|
||||
feed("/A<Enter>")
|
||||
expect("A\nA")
|
||||
eq({mode='n', blocking=false}, nvim("get_mode"))
|
||||
end)
|
||||
end)
|
||||
|
|
Loading…
Reference in New Issue