Patch 8.0.1148
Problem: "gN" doesn't work on last match with 'wrapscan' off. (fcpg)
Solution: Adjust for searching backward. (Christian Brabandt)
Files: src/search.c, src/testdir/test_gn.vim
*** ../vim-8.0.1147/src/search.c 2017-09-22 15:20:27.744148592 +0200
--- src/search.c 2017-09-26 12:19:50.293967527 +0200
***************
*** 4611,4617 ****
#endif /* FEAT_TEXTOBJ */
! static int is_one_char(char_u *pattern, int move, pos_T *cur);
/*
* Find next search match under cursor, cursor at end.
--- 4611,4617 ----
#endif /* FEAT_TEXTOBJ */
! static int is_one_char(char_u *pattern, int move, pos_T *cur, int direction);
/*
* Find next search match under cursor, cursor at end.
***************
*** 4632,4637 ****
--- 4632,4638 ----
int flags = 0;
pos_T save_VIsual = VIsual;
int one_char;
+ int direction = forward ? FORWARD : BACKWARD;
/* wrapping should not occur */
p_ws = FALSE;
***************
*** 4658,4665 ****
else
orig_pos = pos = curwin->w_cursor;
! /* Is the pattern is zero-width? */
! one_char = is_one_char(spats[last_idx].pat, TRUE, &curwin->w_cursor);
if (one_char == -1)
{
p_ws = old_p_ws;
--- 4659,4668 ----
else
orig_pos = pos = curwin->w_cursor;
! /* Is the pattern is zero-width?, this time, don't care about the
direction
! */
! one_char = is_one_char(spats[last_idx].pat, TRUE, &curwin->w_cursor,
! FORWARD);
if (one_char == -1)
{
p_ws = old_p_ws;
***************
*** 4718,4728 ****
}
start_pos = pos;
! flags = forward ? SEARCH_END : 0;
/* Check again from the current cursor position,
* since the next match might actually by only one char wide */
! one_char = is_one_char(spats[last_idx].pat, FALSE, &pos);
if (one_char < 0)
/* search failed, abort */
return FAIL;
--- 4721,4731 ----
}
start_pos = pos;
! flags = forward ? SEARCH_END : SEARCH_START;
/* Check again from the current cursor position,
* since the next match might actually by only one char wide */
! one_char = is_one_char(spats[last_idx].pat, FALSE, &pos, direction);
if (one_char < 0)
/* search failed, abort */
return FAIL;
***************
*** 4730,4736 ****
/* move to match, except for zero-width matches, in which case, we are
* already on the next match */
if (!one_char)
! result = searchit(curwin, curbuf, &pos, (forward ? FORWARD : BACKWARD),
spats[last_idx].pat, 0L, flags | SEARCH_KEEP, RE_SEARCH, 0,
NULL, NULL);
--- 4733,4739 ----
/* move to match, except for zero-width matches, in which case, we are
* already on the next match */
if (!one_char)
! result = searchit(curwin, curbuf, &pos, direction,
spats[last_idx].pat, 0L, flags | SEARCH_KEEP, RE_SEARCH, 0,
NULL, NULL);
***************
*** 4779,4788 ****
* Check if the pattern is one character long or zero-width.
* If move is TRUE, check from the beginning of the buffer, else from position
* "cur".
* Returns TRUE, FALSE or -1 for failure.
*/
static int
! is_one_char(char_u *pattern, int move, pos_T *cur)
{
regmmatch_T regmatch;
int nmatched = 0;
--- 4782,4792 ----
* Check if the pattern is one character long or zero-width.
* If move is TRUE, check from the beginning of the buffer, else from position
* "cur".
+ * "direction" is FORWARD or BACKWARD.
* Returns TRUE, FALSE or -1 for failure.
*/
static int
! is_one_char(char_u *pattern, int move, pos_T *cur, int direction)
{
regmmatch_T regmatch;
int nmatched = 0;
***************
*** 4812,4818 ****
flag = SEARCH_START;
}
! if (searchit(curwin, curbuf, &pos, FORWARD, pattern, 1,
SEARCH_KEEP + flag, RE_SEARCH, 0, NULL, NULL) != FAIL)
{
/* Zero-width pattern should match somewhere, then we can check if
--- 4816,4822 ----
flag = SEARCH_START;
}
! if (searchit(curwin, curbuf, &pos, direction, pattern, 1,
SEARCH_KEEP + flag, RE_SEARCH, 0, NULL, NULL) != FAIL)
{
/* Zero-width pattern should match somewhere, then we can check if
***************
*** 4825,4831 ****
pos.lnum, regmatch.startpos[0].col, NULL, NULL);
if (!nmatched)
break;
! } while (regmatch.startpos[0].col < pos.col);
if (!called_emsg)
{
--- 4829,4836 ----
pos.lnum, regmatch.startpos[0].col, NULL, NULL);
if (!nmatched)
break;
! } while (direction == FORWARD ? regmatch.startpos[0].col < pos.col
! : regmatch.startpos[0].col > pos.col);
if (!called_emsg)
{
*** ../vim-8.0.1147/src/testdir/test_gn.vim 2017-06-05 19:56:01.124964522
+0200
--- src/testdir/test_gn.vim 2017-09-26 12:14:22.655974916 +0200
***************
*** 111,116 ****
--- 111,125 ----
call assert_equal(['foo baz'], getline(1,'$'))
sil! %d_
+ " search upwards with nowrapscan set
+ call setline('.', ['foo', 'bar', 'foo', 'baz'])
+ set nowrapscan
+ let @/='foo'
+ $
+ norm! dgN
+ call assert_equal(['foo', 'bar', '', 'baz'], getline(1,'$'))
+ sil! %d_
+
set wrapscan&vim
set belloff&vim
endfu
*** ../vim-8.0.1147/src/version.c 2017-09-26 11:15:49.005509564 +0200
--- src/version.c 2017-09-26 12:16:17.903268534 +0200
***************
*** 763,764 ****
--- 763,766 ----
{ /* Add new patch number below this line */
+ /**/
+ 1148,
/**/
--
hundred-and-one symptoms of being an internet addict:
198. You read all the quotes at Netaholics Anonymous and keep thinking
"What's wrong with that?"
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
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.