mirror of
https://github.com/neovim/neovim.git
synced 2025-10-08 02:46:31 +00:00
vim-patch:7.4.2100
Problem: "cgn" and "dgn" do not work correctly with a single character
match and the replacement includes the searched pattern. (John
Beckett)
Solution: If the match is found in the wrong column try in the next column.
Turn the test into new style. (Christian Brabandt)
6835dc61ae
Closes #5796
This commit is contained in:
@@ -3977,7 +3977,7 @@ current_search (
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if the pattern is one character or zero-width.
|
||||
* Check if the pattern is one character long or zero-width.
|
||||
* If move is true, check from the beginning of the buffer,
|
||||
* else from the current cursor position.
|
||||
* Returns TRUE, FALSE or -1 for failure.
|
||||
@@ -3991,10 +3991,16 @@ static int is_one_char(char_u *pattern, bool move)
|
||||
int save_called_emsg = called_emsg;
|
||||
int flag = 0;
|
||||
|
||||
if (pattern == NULL) {
|
||||
pattern = spats[last_idx].pat;
|
||||
}
|
||||
|
||||
if (search_regcomp(pattern, RE_SEARCH, RE_SEARCH,
|
||||
SEARCH_KEEP, ®match) == FAIL)
|
||||
return -1;
|
||||
|
||||
// init startcol correctly
|
||||
regmatch.startpos[0].col = -1;
|
||||
/* move to match */
|
||||
if (move) {
|
||||
clearpos(&pos);
|
||||
@@ -4003,21 +4009,29 @@ static int is_one_char(char_u *pattern, bool move)
|
||||
/* accept a match at the cursor position */
|
||||
flag = SEARCH_START;
|
||||
}
|
||||
if (searchit(curwin, curbuf, &pos, FORWARD, spats[last_idx].pat, 1,
|
||||
if (searchit(curwin, curbuf, &pos, FORWARD, pattern, 1,
|
||||
SEARCH_KEEP + flag, RE_SEARCH, 0, NULL) != FAIL) {
|
||||
/* Zero-width pattern should match somewhere, then we can check if
|
||||
* start and end are in the same position. */
|
||||
called_emsg = FALSE;
|
||||
nmatched = vim_regexec_multi(®match, curwin, curbuf,
|
||||
pos.lnum, (colnr_T)0, NULL);
|
||||
do {
|
||||
regmatch.startpos[0].col++;
|
||||
nmatched = vim_regexec_multi(®match, curwin, curbuf,
|
||||
pos.lnum, regmatch.startpos[0].col, NULL);
|
||||
if (!nmatched) {
|
||||
break;
|
||||
}
|
||||
} while (regmatch.startpos[0].col < pos.col);
|
||||
|
||||
if (!called_emsg)
|
||||
if (!called_emsg) {
|
||||
result = (nmatched != 0
|
||||
&& regmatch.startpos[0].lnum == regmatch.endpos[0].lnum
|
||||
&& regmatch.startpos[0].col == regmatch.endpos[0].col);
|
||||
|
||||
if (!result && inc(&pos) >= 0 && pos.col == regmatch.endpos[0].col)
|
||||
result = TRUE;
|
||||
// one char width
|
||||
if (!result && inc(&pos) >= 0 && pos.col == regmatch.endpos[0].col) {
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
called_emsg |= save_called_emsg;
|
||||
|
Reference in New Issue
Block a user