aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJames McCoy <jamessan@jamessan.com>2017-06-25 11:01:16 -0400
committerJames McCoy <jamessan@jamessan.com>2017-06-26 22:08:11 -0400
commit0dd64556590633b2cab7cd846b28bbf5f7ef35d4 (patch)
treed66d8aa538c4bb929f55b0633a2e3a5b89e5db87 /src
parent518b42db916ccbb9057ca9361b48e83ea65bc3b9 (diff)
downloadrneovim-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.c128
-rw-r--r--src/nvim/testdir/test_search.vim80
-rw-r--r--src/nvim/version.c2
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,