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 [email protected].
For more options, visit https://groups.google.com/d/optout.
From 39023f250005e091775c81beea622630ecbc20f2 Mon Sep 17 00:00:00 2001
From: Christian Brabandt <[email protected]>
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