From 7a5a85d2c4711dce3d0850af93d510eed46fe118 Mon Sep 17 00:00:00 2001 From: David Bürgin <676c7473@gmail.com> Date: Fri, 27 Mar 2015 09:34:54 +0100 Subject: vim-patch:7.4.636 #2267 Problem: A search with end offset gets stuck at end of file. (Gary Johnson) Solution: When a search doesn't move the cursor repeat it with a higher count. (Christian Brabandt) https://github.com/vim/vim/releases/tag/v7-4-636 --- src/nvim/normal.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) (limited to 'src/nvim/normal.c') diff --git a/src/nvim/normal.c b/src/nvim/normal.c index e26f5a3d77..c210c8fe8f 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -4361,7 +4361,7 @@ static void nv_ident(cmdarg_T *cap) /* put pattern in search history */ init_history(); add_to_history(HIST_SEARCH, buf, true, NUL); - normal_search(cap, cmdchar == '*' ? '/' : '?', buf, 0); + (void)normal_search(cap, cmdchar == '*' ? '/' : '?', buf, 0); } else do_cmdline_cmd(buf); @@ -4785,7 +4785,7 @@ static void nv_search(cmdarg_T *cap) return; } - normal_search(cap, cap->cmdchar, cap->searchbuf, + (void)normal_search(cap, cap->cmdchar, cap->searchbuf, (cap->arg ? 0 : SEARCH_MARK)); } @@ -4795,15 +4795,25 @@ static void nv_search(cmdarg_T *cap) */ static void nv_next(cmdarg_T *cap) { - normal_search(cap, 0, NULL, SEARCH_MARK | cap->arg); + pos_T old = curwin->w_cursor; + int i = normal_search(cap, 0, NULL, SEARCH_MARK | cap->arg); + + if (i == 1 && equalpos(old, curwin->w_cursor)) { + // Avoid getting stuck on the current cursor position, which can happen when + // an offset is given and the cursor is on the last char in the buffer: + // Repeat with count + 1. + cap->count1 += 1; + (void)normal_search(cap, 0, NULL, SEARCH_MARK | cap->arg); + cap->count1 -= 1; + } } /* * Search for "pat" in direction "dir" ('/' or '?', 0 for repeat). * Uses only cap->count1 and cap->oap from "cap". + * Return 0 for failure, 1 for found, 2 for found and line offset added. */ -static void -normal_search ( +static int normal_search( cmdarg_T *cap, int dir, char_u *pat, @@ -4832,6 +4842,7 @@ normal_search ( /* "/$" will put the cursor after the end of the line, may need to * correct that here */ check_cursor(); + return i; } /* -- cgit