From c03990d30f742154d93184383cae713b69f1147c Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Sat, 9 Aug 2025 23:47:01 +0200 Subject: [PATCH] patch 9.1.1612: Ctrl-G/Ctrl-T do not ignore the end search delimiter Problem: Ctrl-G/Ctrl-T does not ignore the end search delimiter (irisjae) Solution: Check if the pattern ends with a search delimiter and ignore it, unless it is part of the pattern. fixes: #17895 closes: #17933 Signed-off-by: Christian Brabandt --- src/ex_getln.c | 15 ++++ .../dumps/Test_incsearch_delim_01.dump | 6 ++ .../dumps/Test_incsearch_delim_02.dump | 6 ++ .../dumps/Test_incsearch_delim_03.dump | 6 ++ .../dumps/Test_incsearch_delim_04.dump | 6 ++ src/testdir/test_search.vim | 81 +++++++++++++++++++ src/version.c | 2 + 7 files changed, 122 insertions(+) create mode 100644 src/testdir/dumps/Test_incsearch_delim_01.dump create mode 100644 src/testdir/dumps/Test_incsearch_delim_02.dump create mode 100644 src/testdir/dumps/Test_incsearch_delim_03.dump create mode 100644 src/testdir/dumps/Test_incsearch_delim_04.dump diff --git a/src/ex_getln.c b/src/ex_getln.c index 0febe432b8..93ce070626 100644 --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -620,6 +620,7 @@ may_adjust_incsearch_highlighting( int search_flags = SEARCH_NOOF; int i; int save; + int bslsh = FALSE; int search_delim; // Parsing range may already set the last search pattern. @@ -652,6 +653,18 @@ may_adjust_incsearch_highlighting( else pat = ccline.cmdbuff + skiplen; + // do not search for the search end delimiter, + // unless it is part of the pattern + if (patlen > 2 && firstc == pat[patlen - 1]) + { + patlen--; + if (pat[patlen - 1] == '\\') + { + pat[patlen - 1] = firstc; + bslsh = TRUE; + } + } + cursor_off(); out_flush(); if (c == Ctrl_G) @@ -675,6 +688,8 @@ may_adjust_incsearch_highlighting( pat, patlen, count, search_flags, RE_SEARCH, NULL); --emsg_off; pat[patlen] = save; + if (bslsh) + pat[patlen - 1] = '\\'; if (i) { is_state->search_start = is_state->match_start; diff --git a/src/testdir/dumps/Test_incsearch_delim_01.dump b/src/testdir/dumps/Test_incsearch_delim_01.dump new file mode 100644 index 0000000000..84a5d7c75b --- /dev/null +++ b/src/testdir/dumps/Test_incsearch_delim_01.dump @@ -0,0 +1,6 @@ +|1+0&#ffffff0| |v+0&#ffff4012|i|m| |i+0&#ffffff0|n|c| @65 +|2| |v+1&&|i|m| |/+0&&| @67 +|3| |v+0&#ffff4012|i|m| |/+0&#ffffff0| @67 +|4| |v+0&#ffff4012|i|m| |?+0&#ffffff0| @67 +|5| |v+0&#ffff4012|i|m| |?+0&#ffffff0| @67 +|/|v|i|m| |/> @68 diff --git a/src/testdir/dumps/Test_incsearch_delim_02.dump b/src/testdir/dumps/Test_incsearch_delim_02.dump new file mode 100644 index 0000000000..46b22e0cba --- /dev/null +++ b/src/testdir/dumps/Test_incsearch_delim_02.dump @@ -0,0 +1,6 @@ +|1+0&#ffffff0| |v+0&#ffff4012|i|m| |i+0&#ffffff0|n|c| @65 +|2| |v+0&#ffff4012|i|m| |/+0&#ffffff0| @67 +|3| |v+1&&|i|m| |/+0&&| @67 +|4| |v+0&#ffff4012|i|m| |?+0&#ffffff0| @67 +|5| |v+0&#ffff4012|i|m| |?+0&#ffffff0| @67 +|?|v|i|m| |?> @68 diff --git a/src/testdir/dumps/Test_incsearch_delim_03.dump b/src/testdir/dumps/Test_incsearch_delim_03.dump new file mode 100644 index 0000000000..2aca1c8e8a --- /dev/null +++ b/src/testdir/dumps/Test_incsearch_delim_03.dump @@ -0,0 +1,6 @@ +|1+0&#ffffff0| |v|i|m| |i|n|c| @65 +|2| |v+0&#ffff4012|i|m| |/| +0&#ffffff0@67 +|3| |v+1&&|i|m| |/| +0&&@67 +|4| |v|i|m| |?| @67 +|5| |v|i|m| |?| @67 +|/|v|i|m| |\|/> @67 diff --git a/src/testdir/dumps/Test_incsearch_delim_04.dump b/src/testdir/dumps/Test_incsearch_delim_04.dump new file mode 100644 index 0000000000..2d049a0014 --- /dev/null +++ b/src/testdir/dumps/Test_incsearch_delim_04.dump @@ -0,0 +1,6 @@ +|1+0&#ffffff0| |v|i|m| |i|n|c| @65 +|2| |v|i|m| |/| @67 +|3| |v|i|m| |/| @67 +|4| |v+0&#ffff4012|i|m| |?| +0&#ffffff0@67 +|5| |v+1&&|i|m| |?| +0&&@67 +|?|v|i|m| |\|?> @67 diff --git a/src/testdir/test_search.vim b/src/testdir/test_search.vim index 4e5fd0620f..65b55999e2 100644 --- a/src/testdir/test_search.vim +++ b/src/testdir/test_search.vim @@ -2254,5 +2254,86 @@ func Test_search_with_invalid_range() bwipe! endfunc +func Test_incsearch_delimiter_ctrlg() + CheckOption incsearch + CheckScreendump + CheckRunVimInTerminal + call assert_equal(0, &scrolloff) + call writefile([ + \ 'set incsearch hls', + \ 'call setline(1, ["1 vim inc", "2 vim /", "3 vim /", "4 vim ?", "5 vim ?"])', + \ 'normal gg', + \ 'redraw', + \ ], 'Xscript_incsearch_delim', 'D') + let buf = RunVimInTerminal('-S Xscript_incsearch_delim', {'rows': 6}) + + call term_sendkeys(buf, '/') + sleep 100m + call term_sendkeys(buf, 'v') + sleep 100m + call term_sendkeys(buf, 'i') + sleep 100m + call term_sendkeys(buf, 'm') + sleep 100m + call term_sendkeys(buf, ' ') + sleep 100m + call term_sendkeys(buf, '/') + sleep 100m + call term_sendkeys(buf, "\") + call VerifyScreenDump(buf, 'Test_incsearch_delim_01', {}) + call term_sendkeys(buf, "\") + + call term_sendkeys(buf, ":5\") + call term_sendkeys(buf, '?') + sleep 100m + call term_sendkeys(buf, 'v') + sleep 100m + call term_sendkeys(buf, 'i') + sleep 100m + call term_sendkeys(buf, 'm') + sleep 100m + call term_sendkeys(buf, ' ') + sleep 100m + call term_sendkeys(buf, '?') + sleep 100m + call term_sendkeys(buf, "\") + call VerifyScreenDump(buf, 'Test_incsearch_delim_02', {}) + call term_sendkeys(buf, "\") + + call term_sendkeys(buf, '/') + sleep 100m + call term_sendkeys(buf, 'v') + sleep 100m + call term_sendkeys(buf, 'i') + sleep 100m + call term_sendkeys(buf, 'm') + sleep 100m + call term_sendkeys(buf, ' ') + sleep 100m + call term_sendkeys(buf, '\/') + sleep 100m + call term_sendkeys(buf, "\") + call VerifyScreenDump(buf, 'Test_incsearch_delim_03', {}) + call term_sendkeys(buf, "\") + + call term_sendkeys(buf, ":5\") + call term_sendkeys(buf, '?') + sleep 100m + call term_sendkeys(buf, 'v') + sleep 100m + call term_sendkeys(buf, 'i') + sleep 100m + call term_sendkeys(buf, 'm') + sleep 100m + call term_sendkeys(buf, ' ') + sleep 100m + call term_sendkeys(buf, '\?') + sleep 100m + call term_sendkeys(buf, "\") + call VerifyScreenDump(buf, 'Test_incsearch_delim_04', {}) + call term_sendkeys(buf, "\") + + call StopVimInTerminal(buf) +endfunc " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 4716c5d0d8..68f1ff2940 100644 --- a/src/version.c +++ b/src/version.c @@ -719,6 +719,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1612, /**/ 1611, /**/