On Fr, 30 Jun 2017, Bram Moolenaar wrote:

> OK, now I get it.  Looks like CTRL-G works in the other direction.
> I'll leave this to Christian.

Here is a patch.

Best,
Christian
-- 
Augen, die nicht ferne blicken,
Und auch nicht zur Liebe taugen,
Aber ganz entsetzlich drücken,
Sind des Vetters Hühneraugen.

                -- Heinrich Heine

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
From 39023f250005e091775c81beea622630ecbc20f2 Mon Sep 17 00:00:00 2001
From: Christian Brabandt <c...@256bit.org>
Date: Fri, 30 Jun 2017 20:12:00 +0200
Subject: [PATCH] searching backwards with ? and <c-g> works unexpected

When incsearch is set and one uses ? and <c-g> the cursor might be moved
to an unexpected location.

Make sure, the cursor is put at the expected location and add a test.
---
 src/ex_getln.c              |  8 ++++++++
 src/testdir/test_search.vim | 34 ++++++++++++++++++++++++++++++++++
 2 files changed, 42 insertions(+)

diff --git a/src/ex_getln.c b/src/ex_getln.c
index 11de136bf..a888ba412 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -1708,6 +1708,14 @@ getcmdline(
 			    search_start = t;
 			    (void)decl(&search_start);
 			}
+			else if (c == Ctrl_G && firstc == '?')
+			{
+			    /* move just after the current match, so that
+			     * when nv_search finishes the cursor will be
+			     * put back on the match */
+			    search_start = t;
+			    (void)incl(&search_start);
+			}
 			if (LT_POS(t, search_start) && c == Ctrl_G)
 			{
 			    /* wrap around */
diff --git a/src/testdir/test_search.vim b/src/testdir/test_search.vim
index 18a4577b7..69b1335ef 100644
--- a/src/testdir/test_search.vim
+++ b/src/testdir/test_search.vim
@@ -322,3 +322,37 @@ func Test_search_cmdline3()
   call test_override("char_avail", 0)
   bw!
 endfunc
+
+func Test_search_cmdline4()
+  if !exists('+incsearch')
+    return
+  endif
+  " need to disable char_avail,
+  " so that expansion of commandline works
+  call test_override("char_avail", 1)
+  new
+  call setline(1, ['  1 the first', '  2 the second', '  3 the third'])
+  set incsearch
+  $
+  call feedkeys("?the\<c-g>\<cr>", 'tx')
+  call assert_equal('  3 the third', getline('.'))
+  $
+  call feedkeys("?the\<c-g>\<c-g>\<cr>", 'tx')
+  call assert_equal('  1 the first', getline('.'))
+  $
+  call feedkeys("?the\<c-g>\<c-g>\<c-g>\<cr>", 'tx')
+  call assert_equal('  2 the second', getline('.'))
+  $
+  call feedkeys("?the\<c-t>\<cr>", 'tx')
+  call assert_equal('  1 the first', getline('.'))
+  $
+  call feedkeys("?the\<c-t>\<c-t>\<cr>", 'tx')
+  call assert_equal('  3 the third', getline('.'))
+  $
+  call feedkeys("?the\<c-t>\<c-t>\<c-t>\<cr>", 'tx')
+  call assert_equal('  2 the second', getline('.'))
+  " clean up
+  set noincsearch
+  call test_override("char_avail", 0)
+  bw!
+endfunc
-- 
2.11.0

Reply via email to