diff options
author | James McCoy <jamessan@jamessan.com> | 2017-06-25 11:01:16 -0400 |
---|---|---|
committer | James McCoy <jamessan@jamessan.com> | 2017-06-26 22:08:11 -0400 |
commit | 0dd64556590633b2cab7cd846b28bbf5f7ef35d4 (patch) | |
tree | d66d8aa538c4bb929f55b0633a2e3a5b89e5db87 /src | |
parent | 518b42db916ccbb9057ca9361b48e83ea65bc3b9 (diff) | |
download | rneovim-0dd64556590633b2cab7cd846b28bbf5f7ef35d4.tar.gz rneovim-0dd64556590633b2cab7cd846b28bbf5f7ef35d4.tar.bz2 rneovim-0dd64556590633b2cab7cd846b28bbf5f7ef35d4.zip |
vim-patch:7.4.2268
Problem: Using CTRL-N and CTRL-P for incsearch shadows completion keys.
Solution: Use CTRL-T and CTRL-G instead.
https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/ex_getln.c | 128 | ||||
-rw-r--r-- | src/nvim/testdir/test_search.vim | 80 | ||||
-rw-r--r-- | src/nvim/version.c | 2 |
3 files changed, 107 insertions, 103 deletions
diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c index efa8cd24bc..62f802fb8f 100644 --- a/src/nvim/ex_getln.c +++ b/src/nvim/ex_getln.c @@ -1282,72 +1282,12 @@ static int command_line_handle_key(CommandLineState *s) case Ctrl_N: // next match case Ctrl_P: // previous match - if (p_is && !cmd_silent && (s->firstc == '/' || s->firstc == '?')) { - pos_T t; - int search_flags = SEARCH_KEEP + SEARCH_NOOF + SEARCH_PEEK; - - if (char_avail()) { - return 1; - } - ui_busy_start(); - ui_flush(); - if (s->c == Ctrl_N) { - t = s->match_end; - search_flags += SEARCH_COL; - } else { - t = s->match_start; - } - emsg_off++; - s->i = searchit(curwin, curbuf, &t, - s->c == Ctrl_N ? FORWARD : BACKWARD, - ccline.cmdbuff, s->count, search_flags, - RE_SEARCH, 0, NULL); - emsg_off--; - ui_busy_stop(); - if (s->i) { - s->old_cursor = s->match_start; - s->match_end = t; - s->match_start = t; - if (s->c == Ctrl_P && s->firstc == '/') { - // move just before the current match, so that - // when nv_search finishes the cursor will be - // put back on the match - s->old_cursor = t; - (void)decl(&s->old_cursor); - } - if (lt(t, s->old_cursor) && s->c == Ctrl_N) { - // wrap around - s->old_cursor = t; - if (s->firstc == '?') { - (void)incl(&s->old_cursor); - } else { - (void)decl(&s->old_cursor); - } - } - - set_search_match(&s->match_end); - curwin->w_cursor = s->match_start; - changed_cline_bef_curs(); - update_topline(); - validate_cursor(); - highlight_match = true; - s->old_curswant = curwin->w_curswant; - s->old_leftcol = curwin->w_leftcol; - s->old_topline = curwin->w_topline; - s->old_topfill = curwin->w_topfill; - s->old_botline = curwin->w_botline; - update_screen(NOT_VALID); - redrawcmdline(); - } else { - vim_beep(BO_ERROR); - } - return command_line_not_changed(s); - } else if (s->xpc.xp_numfiles > 0) { + if (s->xpc.xp_numfiles > 0) { if (nextwild(&s->xpc, (s->c == Ctrl_P) ? WILD_PREV : WILD_NEXT, 0, s->firstc != '@') == FAIL) { break; } - return command_line_changed(s); + return command_line_not_changed(s); } // fallthrough @@ -1488,6 +1428,70 @@ static int command_line_handle_key(CommandLineState *s) beep_flush(); return command_line_not_changed(s); + case Ctrl_G: // next match + case Ctrl_T: // previous match + if (p_is && !cmd_silent && (s->firstc == '/' || s->firstc == '?')) { + pos_T t; + int search_flags = SEARCH_KEEP + SEARCH_NOOF + SEARCH_PEEK; + + if (char_avail()) { + return 1; + } + ui_busy_start(); + ui_flush(); + if (s->c == Ctrl_G) { + t = s->match_end; + search_flags += SEARCH_COL; + } else { + t = s->match_start; + } + emsg_off++; + s->i = searchit(curwin, curbuf, &t, + s->c == Ctrl_G ? FORWARD : BACKWARD, + ccline.cmdbuff, s->count, search_flags, + RE_SEARCH, 0, NULL); + emsg_off--; + ui_busy_stop(); + if (s->i) { + s->old_cursor = s->match_start; + s->match_end = t; + s->match_start = t; + if (s->c == Ctrl_T && s->firstc == '/') { + // move just before the current match, so that + // when nv_search finishes the cursor will be + // put back on the match + s->old_cursor = t; + (void)decl(&s->old_cursor); + } + if (lt(t, s->old_cursor) && s->c == Ctrl_G) { + // wrap around + s->old_cursor = t; + if (s->firstc == '?') { + (void)incl(&s->old_cursor); + } else { + (void)decl(&s->old_cursor); + } + } + + set_search_match(&s->match_end); + curwin->w_cursor = s->match_start; + changed_cline_bef_curs(); + update_topline(); + validate_cursor(); + highlight_match = true; + s->old_curswant = curwin->w_curswant; + s->old_leftcol = curwin->w_leftcol; + s->old_topline = curwin->w_topline; + s->old_topfill = curwin->w_topfill; + s->old_botline = curwin->w_botline; + update_screen(NOT_VALID); + redrawcmdline(); + } else { + vim_beep(BO_ERROR); + } + } + return command_line_not_changed(s); + case Ctrl_V: case Ctrl_Q: s->ignore_drag_release = true; diff --git a/src/nvim/testdir/test_search.vim b/src/nvim/testdir/test_search.vim index 1398cc4d4e..28e504a883 100644 --- a/src/nvim/testdir/test_search.vim +++ b/src/nvim/testdir/test_search.vim @@ -18,11 +18,11 @@ func Test_search_cmdline() call feedkeys("/foobar\<cr>", 'tx') call feedkeys("/the\<cr>",'tx') call assert_equal('the', @/) - call feedkeys("/thes\<c-p>\<c-p>\<cr>",'tx') + call feedkeys("/thes\<C-P>\<C-P>\<cr>",'tx') call assert_equal('foobar', @/) " Test 2 - " Ctrl-N goes from one match to the next + " Ctrl-G goes from one match to the next " until the end of the buffer set incsearch nowrapscan :1 @@ -31,39 +31,39 @@ func Test_search_cmdline() call assert_equal(' 2 these', getline('.')) :1 " second match - call feedkeys("/the\<c-n>\<cr>", 'tx') + call feedkeys("/the\<C-G>\<cr>", 'tx') call assert_equal(' 3 the', getline('.')) :1 " third match - call feedkeys("/the".repeat("\<c-n>", 2)."\<cr>", 'tx') + call feedkeys("/the".repeat("\<C-G>", 2)."\<cr>", 'tx') call assert_equal(' 4 their', getline('.')) :1 " fourth match - call feedkeys("/the".repeat("\<c-n>", 3)."\<cr>", 'tx') + call feedkeys("/the".repeat("\<C-G>", 3)."\<cr>", 'tx') call assert_equal(' 5 there', getline('.')) :1 " fifth match - call feedkeys("/the".repeat("\<c-n>", 4)."\<cr>", 'tx') + call feedkeys("/the".repeat("\<C-G>", 4)."\<cr>", 'tx') call assert_equal(' 6 their', getline('.')) :1 " sixth match - call feedkeys("/the".repeat("\<c-n>", 5)."\<cr>", 'tx') + call feedkeys("/the".repeat("\<C-G>", 5)."\<cr>", 'tx') call assert_equal(' 7 the', getline('.')) :1 " seventh match - call feedkeys("/the".repeat("\<c-n>", 6)."\<cr>", 'tx') + call feedkeys("/the".repeat("\<C-G>", 6)."\<cr>", 'tx') call assert_equal(' 8 them', getline('.')) :1 " eigth match - call feedkeys("/the".repeat("\<c-n>", 7)."\<cr>", 'tx') + call feedkeys("/the".repeat("\<C-G>", 7)."\<cr>", 'tx') call assert_equal(' 9 these', getline('.')) :1 " no further match - call feedkeys("/the".repeat("\<c-n>", 8)."\<cr>", 'tx') + call feedkeys("/the".repeat("\<C-G>", 8)."\<cr>", 'tx') call assert_equal(' 9 these', getline('.')) " Test 3 - " Ctrl-N goes from one match to the next + " Ctrl-G goes from one match to the next " and continues back at the top set incsearch wrapscan :1 @@ -72,39 +72,39 @@ func Test_search_cmdline() call assert_equal(' 2 these', getline('.')) :1 " second match - call feedkeys("/the\<c-n>\<cr>", 'tx') + call feedkeys("/the\<C-G>\<cr>", 'tx') call assert_equal(' 3 the', getline('.')) :1 " third match - call feedkeys("/the".repeat("\<c-n>", 2)."\<cr>", 'tx') + call feedkeys("/the".repeat("\<C-G>", 2)."\<cr>", 'tx') call assert_equal(' 4 their', getline('.')) :1 " fourth match - call feedkeys("/the".repeat("\<c-n>", 3)."\<cr>", 'tx') + call feedkeys("/the".repeat("\<C-G>", 3)."\<cr>", 'tx') call assert_equal(' 5 there', getline('.')) :1 " fifth match - call feedkeys("/the".repeat("\<c-n>", 4)."\<cr>", 'tx') + call feedkeys("/the".repeat("\<C-G>", 4)."\<cr>", 'tx') call assert_equal(' 6 their', getline('.')) :1 " sixth match - call feedkeys("/the".repeat("\<c-n>", 5)."\<cr>", 'tx') + call feedkeys("/the".repeat("\<C-G>", 5)."\<cr>", 'tx') call assert_equal(' 7 the', getline('.')) :1 " seventh match - call feedkeys("/the".repeat("\<c-n>", 6)."\<cr>", 'tx') + call feedkeys("/the".repeat("\<C-G>", 6)."\<cr>", 'tx') call assert_equal(' 8 them', getline('.')) :1 " eigth match - call feedkeys("/the".repeat("\<c-n>", 7)."\<cr>", 'tx') + call feedkeys("/the".repeat("\<C-G>", 7)."\<cr>", 'tx') call assert_equal(' 9 these', getline('.')) :1 " back at first match - call feedkeys("/the".repeat("\<c-n>", 8)."\<cr>", 'tx') + call feedkeys("/the".repeat("\<C-G>", 8)."\<cr>", 'tx') call assert_equal(' 2 these', getline('.')) " Test 4 - " CTRL-P goes to the previous match + " CTRL-T goes to the previous match set incsearch nowrapscan $ " first match @@ -112,23 +112,23 @@ func Test_search_cmdline() call assert_equal(' 9 these', getline('.')) $ " first match - call feedkeys("?the\<c-n>\<cr>", 'tx') + call feedkeys("?the\<C-G>\<cr>", 'tx') call assert_equal(' 9 these', getline('.')) $ " second match - call feedkeys("?the".repeat("\<c-p>", 1)."\<cr>", 'tx') + call feedkeys("?the".repeat("\<C-T>", 1)."\<cr>", 'tx') call assert_equal(' 8 them', getline('.')) $ " last match - call feedkeys("?the".repeat("\<c-p>", 7)."\<cr>", 'tx') + call feedkeys("?the".repeat("\<C-T>", 7)."\<cr>", 'tx') call assert_equal(' 2 these', getline('.')) $ " last match - call feedkeys("?the".repeat("\<c-p>", 8)."\<cr>", 'tx') + call feedkeys("?the".repeat("\<C-T>", 8)."\<cr>", 'tx') call assert_equal(' 2 these', getline('.')) " Test 5 - " CTRL-P goes to the previous match + " CTRL-T goes to the previous match set incsearch wrapscan $ " first match @@ -136,19 +136,19 @@ func Test_search_cmdline() call assert_equal(' 9 these', getline('.')) $ " first match at the top - call feedkeys("?the\<c-n>\<cr>", 'tx') + call feedkeys("?the\<C-G>\<cr>", 'tx') call assert_equal(' 2 these', getline('.')) $ " second match - call feedkeys("?the".repeat("\<c-p>", 1)."\<cr>", 'tx') + call feedkeys("?the".repeat("\<C-T>", 1)."\<cr>", 'tx') call assert_equal(' 8 them', getline('.')) $ " last match - call feedkeys("?the".repeat("\<c-p>", 7)."\<cr>", 'tx') + call feedkeys("?the".repeat("\<C-T>", 7)."\<cr>", 'tx') call assert_equal(' 2 these', getline('.')) $ " back at the bottom of the buffer - call feedkeys("?the".repeat("\<c-p>", 8)."\<cr>", 'tx') + call feedkeys("?the".repeat("\<C-T>", 8)."\<cr>", 'tx') call assert_equal(' 9 these', getline('.')) " Test 6 @@ -160,16 +160,16 @@ func Test_search_cmdline() call assert_equal(' 2 these', getline('.')) 1 " go to next match of 'thes' - call feedkeys("/the\<c-l>\<c-n>\<cr>", 'tx') + call feedkeys("/the\<c-l>\<C-G>\<cr>", 'tx') call assert_equal(' 9 these', getline('.')) 1 " wrap around - call feedkeys("/the\<c-l>\<c-n>\<c-n>\<cr>", 'tx') + call feedkeys("/the\<c-l>\<C-G>\<C-G>\<cr>", 'tx') call assert_equal(' 2 these', getline('.')) 1 " wrap around set nowrapscan - call feedkeys("/the\<c-l>\<c-n>\<c-n>\<cr>", 'tx') + call feedkeys("/the\<c-l>\<C-G>\<C-G>\<cr>", 'tx') call assert_equal(' 9 these', getline('.')) " Test 7 @@ -185,7 +185,7 @@ func Test_search_cmdline() call assert_equal(' 9 these', getline('.')) 1 " delete one char, add another, go to previous match, add one char - call feedkeys("/thei\<bs>s\<bs>\<c-p>\<c-l>\<cr>", 'tx') + call feedkeys("/thei\<bs>s\<bs>\<C-T>\<c-l>\<cr>", 'tx') call assert_equal(' 8 them', getline('.')) 1 " delete all chars, start from the beginning again @@ -209,7 +209,7 @@ func Test_search_cmdline2() new call setline(1, [' 1', ' 2 these', ' 3 the theother']) " Test 1 - " Ctrl-P goes correctly back and forth + " Ctrl-T goes correctly back and forth set incsearch 1 " first match @@ -217,27 +217,27 @@ func Test_search_cmdline2() call assert_equal(' 2 these', getline('.')) 1 " go to next match (on next line) - call feedkeys("/the\<c-n>\<cr>", 'tx') + call feedkeys("/the\<C-G>\<cr>", 'tx') call assert_equal(' 3 the theother', getline('.')) 1 " go to next match (still on line 3) - call feedkeys("/the\<c-n>\<c-n>\<cr>", 'tx') + call feedkeys("/the\<C-G>\<C-G>\<cr>", 'tx') call assert_equal(' 3 the theother', getline('.')) 1 " go to next match (still on line 3) - call feedkeys("/the\<c-n>\<c-n>\<c-n>\<cr>", 'tx') + call feedkeys("/the\<C-G>\<C-G>\<C-G>\<cr>", 'tx') call assert_equal(' 3 the theother', getline('.')) 1 " go to previous match (on line 3) - call feedkeys("/the\<c-n>\<c-n>\<c-n>\<c-p>\<cr>", 'tx') + call feedkeys("/the\<C-G>\<C-G>\<C-G>\<C-T>\<cr>", 'tx') call assert_equal(' 3 the theother', getline('.')) 1 " go to previous match (on line 3) - call feedkeys("/the\<c-n>\<c-n>\<c-n>\<c-p>\<c-p>\<cr>", 'tx') + call feedkeys("/the\<C-G>\<C-G>\<C-G>\<C-T>\<C-T>\<cr>", 'tx') call assert_equal(' 3 the theother', getline('.')) 1 " go to previous match (on line 2) - call feedkeys("/the\<c-n>\<c-n>\<c-n>\<c-p>\<c-p>\<c-p>\<cr>", 'tx') + call feedkeys("/the\<C-G>\<C-G>\<C-G>\<C-T>\<C-T>\<C-T>\<cr>", 'tx') call assert_equal(' 2 these', getline('.')) " clean up diff --git a/src/nvim/version.c b/src/nvim/version.c index dceceb46ad..23c2fac28a 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -176,7 +176,7 @@ static const int included_patches[] = { // 2271 NA // 2270 NA 2269, - // 2268, + 2268, // 2267 NA 2266, 2265, |