mirror of
https://github.com/neovim/neovim.git
synced 2025-09-28 14:08:32 +00:00
fix(normal): fix segfault with bracket command jumping to a mark
vim-patch:9.0.0043: insufficient testing for bracket commands
Problem: Insufficient testing for bracket commands.
Solution: Add a few more tests. (closes vim/vim#10668)
cf34434b5e
Cherry-pick a change from patch 8.2.0369.
This commit is contained in:
@@ -5011,8 +5011,6 @@ static void nv_bracket_block(cmdarg_T *cap, const pos_T *old_pos)
|
|||||||
/// cap->arg is BACKWARD for "[" and FORWARD for "]".
|
/// cap->arg is BACKWARD for "[" and FORWARD for "]".
|
||||||
static void nv_brackets(cmdarg_T *cap)
|
static void nv_brackets(cmdarg_T *cap)
|
||||||
{
|
{
|
||||||
pos_T prev_pos;
|
|
||||||
pos_T *pos = NULL; // init for GCC
|
|
||||||
pos_T old_pos; // cursor position before command
|
pos_T old_pos; // cursor position before command
|
||||||
int flag;
|
int flag;
|
||||||
long n;
|
long n;
|
||||||
@@ -5091,19 +5089,19 @@ static void nv_brackets(cmdarg_T *cap)
|
|||||||
nv_put_opt(cap, true);
|
nv_put_opt(cap, true);
|
||||||
} else if (cap->nchar == '\'' || cap->nchar == '`') {
|
} else if (cap->nchar == '\'' || cap->nchar == '`') {
|
||||||
// "['", "[`", "]'" and "]`": jump to next mark
|
// "['", "[`", "]'" and "]`": jump to next mark
|
||||||
fmark_T *fm = NULL;
|
fmark_T *fm = pos_to_mark(curbuf, NULL, curwin->w_cursor);
|
||||||
pos = &curwin->w_cursor;
|
fmark_T *prev_fm;
|
||||||
for (n = cap->count1; n > 0; n--) {
|
for (n = cap->count1; n > 0; n--) {
|
||||||
prev_pos = *pos;
|
prev_fm = fm;
|
||||||
fm = getnextmark(pos, cap->cmdchar == '[' ? BACKWARD : FORWARD,
|
fm = getnextmark(&fm->mark, cap->cmdchar == '[' ? BACKWARD : FORWARD,
|
||||||
cap->nchar == '\'');
|
cap->nchar == '\'');
|
||||||
if (pos == NULL) {
|
if (fm == NULL) {
|
||||||
break;
|
break;
|
||||||
} else {
|
|
||||||
pos = fm != NULL ? &fm->mark : NULL; // Adjust for the next iteration.
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fm = fm == NULL ? pos_to_mark(curbuf, NULL, curwin->w_cursor) : fm;
|
if (fm == NULL) {
|
||||||
|
fm = prev_fm;
|
||||||
|
}
|
||||||
MarkMove flags = kMarkContext;
|
MarkMove flags = kMarkContext;
|
||||||
flags |= cap->nchar == '\'' ? kMarkBeginLine: 0;
|
flags |= cap->nchar == '\'' ? kMarkBeginLine: 0;
|
||||||
nv_mark_move_to(cap, flags, fm);
|
nv_mark_move_to(cap, flags, fm);
|
||||||
|
@@ -1422,9 +1422,16 @@ func Test_normal27_bracket()
|
|||||||
call assert_equal(5, line('.'))
|
call assert_equal(5, line('.'))
|
||||||
call assert_equal(3, col('.'))
|
call assert_equal(3, col('.'))
|
||||||
|
|
||||||
" No mark after line 21, cursor moves to first non blank on current line
|
" No mark before line 1, cursor moves to first non-blank on current line
|
||||||
|
1
|
||||||
|
norm! 5|['
|
||||||
|
call assert_equal(' 1 b', getline('.'))
|
||||||
|
call assert_equal(1, line('.'))
|
||||||
|
call assert_equal(3, col('.'))
|
||||||
|
|
||||||
|
" No mark after line 21, cursor moves to first non-blank on current line
|
||||||
21
|
21
|
||||||
norm! $]'
|
norm! 5|]'
|
||||||
call assert_equal(' 21 b', getline('.'))
|
call assert_equal(' 21 b', getline('.'))
|
||||||
call assert_equal(21, line('.'))
|
call assert_equal(21, line('.'))
|
||||||
call assert_equal(3, col('.'))
|
call assert_equal(3, col('.'))
|
||||||
@@ -1441,12 +1448,40 @@ func Test_normal27_bracket()
|
|||||||
call assert_equal(20, line('.'))
|
call assert_equal(20, line('.'))
|
||||||
call assert_equal(8, col('.'))
|
call assert_equal(8, col('.'))
|
||||||
|
|
||||||
|
" No mark before line 1, cursor does not move
|
||||||
|
1
|
||||||
|
norm! 5|[`
|
||||||
|
call assert_equal(' 1 b', getline('.'))
|
||||||
|
call assert_equal(1, line('.'))
|
||||||
|
call assert_equal(5, col('.'))
|
||||||
|
|
||||||
|
" No mark after line 21, cursor does not move
|
||||||
|
21
|
||||||
|
norm! 5|]`
|
||||||
|
call assert_equal(' 21 b', getline('.'))
|
||||||
|
call assert_equal(21, line('.'))
|
||||||
|
call assert_equal(5, col('.'))
|
||||||
|
|
||||||
|
" Count too large for [`
|
||||||
|
" cursor moves to first lowercase mark
|
||||||
|
norm! 99[`
|
||||||
|
call assert_equal(' 1 b', getline('.'))
|
||||||
|
call assert_equal(1, line('.'))
|
||||||
|
call assert_equal(7, col('.'))
|
||||||
|
|
||||||
|
" Count too large for ]`
|
||||||
|
" cursor moves to last lowercase mark
|
||||||
|
norm! 99]`
|
||||||
|
call assert_equal(' 20 b', getline('.'))
|
||||||
|
call assert_equal(20, line('.'))
|
||||||
|
call assert_equal(8, col('.'))
|
||||||
|
|
||||||
" clean up
|
" clean up
|
||||||
bw!
|
bw!
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
" Test for ( and ) sentence movements
|
||||||
func Test_normal28_parenthesis()
|
func Test_normal28_parenthesis()
|
||||||
" basic testing for ( and )
|
|
||||||
new
|
new
|
||||||
call append(0, ['This is a test. With some sentences!', '', 'Even with a question? And one more. And no sentence here'])
|
call append(0, ['This is a test. With some sentences!', '', 'Even with a question? And one more. And no sentence here'])
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user