vim-patch:8.0.0568: 1gd may hang

Problem:    "1gd" may hang.
Solution:   Don't get stuck in one position. (Christian Brabandt, closes vim/vim#1643)
60402d68da
This commit is contained in:
Jan Edmund Lazo 2018-06-08 11:18:50 -04:00
parent c1d7a28093
commit 141df73930
2 changed files with 31 additions and 7 deletions

View File

@ -3769,14 +3769,17 @@ find_decl (
t = false; /* match after start is failure too */
if (thisblock && t != false) {
pos_T *pos;
const int64_t maxtravel = old_pos.lnum - curwin->w_cursor.lnum + 1;
const pos_T *pos = findmatchlimit(NULL, '}', FM_FORWARD, maxtravel);
/* Check that the block the match is in doesn't end before the
* position where we started the search from. */
if ((pos = findmatchlimit(NULL, '}', FM_FORWARD,
(int)(old_pos.lnum - curwin->w_cursor.lnum + 1))) != NULL
&& pos->lnum < old_pos.lnum)
// Check that the block the match is in doesn't end before the
// position where we started the search from.
if (pos != NULL && pos->lnum < old_pos.lnum) {
// There can't be a useful match before the end of this block.
// Skip to the end
curwin->w_cursor = *pos;
continue;
}
}
if (t == false) {
@ -6895,7 +6898,7 @@ static void nv_g_cmd(cmdarg_T *cap)
else
show_utf8();
break;
// "g<": show scrollback text
case '<':
show_sb_text();
break;

View File

@ -288,3 +288,24 @@ func Test_cursorline_keep_col()
set nocursorline
endfunc
func Test_gd_local_block()
let lines = [
\ ' int main()',
\ '{',
\ ' char *a = "NOT NULL";',
\ ' if(a)',
\ ' {',
\ ' char *b = a;',
\ ' printf("%s\n", b);',
\ ' }',
\ ' else',
\ ' {',
\ ' char *b = "NULL";',
\ ' return b;',
\ ' }',
\ '',
\ ' return 0;',
\ '}',
\ ]
call XTest_goto_decl('1gd', lines, 11, 11)
endfunc