mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
vim-patch:8.0.0033
Problem: Cannot use overlapping positions with matchaddpos().
Solution: Check end of match. (Ozaki Kiichi) Add a test (Hirohito Higashi)
a6c27ee6db
This commit is contained in:
parent
c5d2e442a3
commit
0e99d29169
@ -884,7 +884,7 @@ typedef struct {
|
|||||||
int attr; /* attributes to be used for a match */
|
int attr; /* attributes to be used for a match */
|
||||||
int attr_cur; /* attributes currently active in win_line() */
|
int attr_cur; /* attributes currently active in win_line() */
|
||||||
linenr_T first_lnum; /* first lnum to search for multi-line pat */
|
linenr_T first_lnum; /* first lnum to search for multi-line pat */
|
||||||
colnr_T startcol; /* in win_line() points to char where HL starts */
|
colnr_T startcol; // in win_line() points to char where HL starts
|
||||||
colnr_T endcol; // in win_line() points to char where HL ends
|
colnr_T endcol; // in win_line() points to char where HL ends
|
||||||
bool is_addpos; // position specified directly by matchaddpos()
|
bool is_addpos; // position specified directly by matchaddpos()
|
||||||
proftime_T tm; // for a time limit
|
proftime_T tm; // for a time limit
|
||||||
|
@ -5563,7 +5563,7 @@ static void prepare_search_hl(win_T *wp, linenr_T lnum)
|
|||||||
// in progress
|
// in progress
|
||||||
n = 0;
|
n = 0;
|
||||||
while (shl->first_lnum < lnum && (shl->rm.regprog != NULL
|
while (shl->first_lnum < lnum && (shl->rm.regprog != NULL
|
||||||
|| (cur != NULL && pos_inprogress))) {
|
|| (cur != NULL && pos_inprogress))) {
|
||||||
next_search_hl(wp, shl, shl->first_lnum, (colnr_T)n,
|
next_search_hl(wp, shl, shl->first_lnum, (colnr_T)n,
|
||||||
shl == &search_hl ? NULL : cur);
|
shl == &search_hl ? NULL : cur);
|
||||||
pos_inprogress = !(cur == NULL || cur->pos.cur == 0);
|
pos_inprogress = !(cur == NULL || cur->pos.cur == 0);
|
||||||
@ -5711,20 +5711,22 @@ next_search_hl_pos(
|
|||||||
|
|
||||||
shl->lnum = 0;
|
shl->lnum = 0;
|
||||||
for (i = posmatch->cur; i < MAXPOSMATCH; i++) {
|
for (i = posmatch->cur; i < MAXPOSMATCH; i++) {
|
||||||
if (posmatch->pos[i].lnum == 0) {
|
llpos_T *pos = &posmatch->pos[i];
|
||||||
|
|
||||||
|
if (pos->lnum == 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (posmatch->pos[i].col < mincol) {
|
if (pos->col + pos->len - 1 <= mincol) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (posmatch->pos[i].lnum == lnum) {
|
if (pos->lnum == lnum) {
|
||||||
if (bot != -1) {
|
if (bot != -1) {
|
||||||
// partially sort positions by column numbers
|
// partially sort positions by column numbers
|
||||||
// on the same line
|
// on the same line
|
||||||
if (posmatch->pos[i].col < posmatch->pos[bot].col) {
|
if (pos->col < posmatch->pos[bot].col) {
|
||||||
llpos_T tmp = posmatch->pos[i];
|
llpos_T tmp = *pos;
|
||||||
|
|
||||||
posmatch->pos[i] = posmatch->pos[bot];
|
*pos = posmatch->pos[bot];
|
||||||
posmatch->pos[bot] = tmp;
|
posmatch->pos[bot] = tmp;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -181,6 +181,16 @@ func Test_matchaddpos()
|
|||||||
redraw!
|
redraw!
|
||||||
call assert_equal(screenattr(2,2), screenattr(1,6))
|
call assert_equal(screenattr(2,2), screenattr(1,6))
|
||||||
|
|
||||||
|
" Check overlapping pos
|
||||||
|
call clearmatches()
|
||||||
|
call setline(1, ['1234567890', 'NH'])
|
||||||
|
call matchaddpos('Error', [[1,1,5], [1,3,5], [2,2]])
|
||||||
|
redraw!
|
||||||
|
call assert_notequal(screenattr(2,2), 0)
|
||||||
|
call assert_equal(screenattr(2,2), screenattr(1,5))
|
||||||
|
call assert_equal(screenattr(2,2), screenattr(1,7))
|
||||||
|
call assert_notequal(screenattr(2,2), screenattr(1,8))
|
||||||
|
|
||||||
nohl
|
nohl
|
||||||
syntax off
|
syntax off
|
||||||
set hlsearch&
|
set hlsearch&
|
||||||
|
Loading…
Reference in New Issue
Block a user