Hi Bram,
2015-12-29(Tue) 3:21:01 UTC+9 Bram Moolenaar:
> Patch 7.4.984
> Problem: searchpos() always starts searching in the first column, which is
> not what some people expect. (Brett Stahlman)
> Solution: Add the 'z' flag: start at the specified column.
> Files: src/vim.h, src/eval.c, src/search.c,
> src/testdir/test_searchpos.vim, src/testdir/test_alot.vim,
> runtime/doc/eval.txt
>
>
> *** ../vim-7.4.983/src/vim.h 2015-11-29 17:34:30.447580332 +0100
> --- src/vim.h 2015-12-28 18:43:17.810204047 +0100
> ***************
> *** 930,935 ****
> --- 930,936 ----
> #define SEARCH_MARK 0x200 /* set previous context mark */
> #define SEARCH_KEEP 0x400 /* keep previous search pattern */
> #define SEARCH_PEEK 0x800 /* peek for typed char, cancel search */
> + #define SEARCH_COL 0x1000 /* start at specified column instead of zero */
>
> /* Values for find_ident_under_cursor() */
> #define FIND_IDENT 1 /* find identifier (word) */
> *** ../vim-7.4.983/src/eval.c 2015-12-13 14:45:16.543158883 +0100
> --- src/eval.c 2015-12-28 18:47:27.011462855 +0100
> ***************
> *** 16471,16476 ****
> --- 16471,16477 ----
> #define SP_START 0x10 /* accept match at start position */
> #define SP_SUBPAT 0x20 /* return nr of matching sub-pattern */
> #define SP_END 0x40 /* leave cursor at end of match */
> + #define SP_COLUMN 0x80 /* start at cursor column */
>
> static int get_search_arg __ARGS((typval_T *varp, int *flagsp));
>
> ***************
> *** 16512,16517 ****
> --- 16513,16519 ----
> case 'p': mask = SP_SUBPAT; break;
> case 'r': mask = SP_REPEAT; break;
> case 's': mask = SP_SETPCMARK; break;
> + case 'z': mask = SP_COLUMN; break;
> }
> if (mask == 0)
> {
> ***************
> *** 16530,16536 ****
> }
>
> /*
> ! * Shared by search() and searchpos() functions
> */
> static int
> search_cmn(argvars, match_pos, flagsp)
> --- 16532,16538 ----
> }
>
> /*
> ! * Shared by search() and searchpos() functions.
> */
> static int
> search_cmn(argvars, match_pos, flagsp)
> ***************
> *** 16562,16567 ****
> --- 16564,16571 ----
> options |= SEARCH_START;
> if (flags & SP_END)
> options |= SEARCH_END;
> + if (flags & SP_COLUMN)
> + options |= SEARCH_COL;
>
> /* Optional arguments: line number to stop searching and timeout. */
> if (argvars[1].v_type != VAR_UNKNOWN && argvars[2].v_type !=
> VAR_UNKNOWN)
> *** ../vim-7.4.983/src/search.c 2015-09-01 18:27:45.117248852 +0200
> --- src/search.c 2015-12-28 18:50:35.041394580 +0100
> ***************
> *** 578,583 ****
> --- 578,584 ----
> * if (options & SEARCH_KEEP) keep previous search pattern
> * if (options & SEARCH_FOLD) match only once in a closed fold
> * if (options & SEARCH_PEEK) check for typed char, cancel search
> + * if (options & SEARCH_COL) start at pos->col instead of zero
> *
> * Return FAIL (zero) for failure, non-zero for success.
> * When FEAT_EVAL is defined, returns the index of the first matching
> ***************
> *** 599,604 ****
> --- 600,606 ----
> {
> int found;
> linenr_T lnum; /* no init to shut up Apollo cc */
> + colnr_T col;
> regmmatch_T regmatch;
> char_u *ptr;
> colnr_T matchcol;
> ***************
> *** 711,722 ****
> /*
> * Look for a match somewhere in line "lnum".
> */
> nmatched = vim_regexec_multi(®match, win, buf,
> ! lnum, (colnr_T)0,
> #ifdef FEAT_RELTIME
> ! tm
> #else
> ! NULL
> #endif
> );
> /* Abort searching on an error (e.g., out of stack). */
> --- 713,726 ----
> /*
> * Look for a match somewhere in line "lnum".
> */
> + col = at_first_line && (options & SEARCH_COL) ? pos->col
> + : (colnr_T)0;
> nmatched = vim_regexec_multi(®match, win, buf,
> ! lnum, col,
> #ifdef FEAT_RELTIME
> ! tm
> #else
> ! NULL
> #endif
> );
> /* Abort searching on an error (e.g., out of stack). */
> ***************
> *** 1098,1103 ****
> --- 1102,1108 ----
>
> /*
> * Return the number of the first subpat that matched.
> + * Return zero if none of them matched.
> */
> static int
> first_submatch(rp)
> *** ../vim-7.4.983/src/testdir/test_searchpos.vim 2015-12-28
> 19:16:19.348456356 +0100
> --- src/testdir/test_searchpos.vim 2015-12-28 19:11:00.027953490 +0100
> ***************
> *** 0 ****
> --- 1,28 ----
> + " Tests for searchpos()
> +
> + func Test_searchpos()
> + new one
> + 0put ='1a3'
> + 1put ='123xyz'
> + call cursor(1, 1)
> + call assert_equal([1, 1, 2], searchpos('\%(\([a-z]\)\|\_.\)\{-}xyz',
> 'pcW'))
> + call cursor(1, 2)
> + call assert_equal([2, 1, 1], searchpos('\%(\([a-z]\)\|\_.\)\{-}xyz',
> 'pcW'))
> + set cpo-=c
> + call cursor(1, 2)
> + call assert_equal([1, 2, 2], searchpos('\%(\([a-z]\)\|\_.\)\{-}xyz',
> 'pcW'))
> + call cursor(1, 3)
> + call assert_equal([1, 3, 1], searchpos('\%(\([a-z]\)\|\_.\)\{-}xyz',
> 'pcW'))
> +
> + " Now with \zs, first match is in column 0, "a" is matched.
> + call cursor(1. 3)
> + call assert_equal([2, 4, 2], searchpos('\%(\([a-z]\)\|\_.\)\{-}\zsxyz',
> 'pcW'))
> + " With z flag start at cursor column, don't see the "a".
> + call cursor(1. 3)
> + call assert_equal([2, 4, 1], searchpos('\%(\([a-z]\)\|\_.\)\{-}\zsxyz',
> 'pcWz'))
> +
> + set cpo+=c
> + " close the window
> + q!
> +
> + endfunc
> *** ../vim-7.4.983/src/testdir/test_alot.vim 2015-12-03 16:54:21.970106719
> +0100
> --- src/testdir/test_alot.vim 2015-12-28 18:57:11.153037829 +0100
> ***************
> *** 2,6 ****
> --- 2,7 ----
> " This makes testing go faster, since Vim doesn't need to restart.
>
> source test_lispwords.vim
> + source test_searchpos.vim
> source test_sort.vim
> source test_undolevels.vim
> *** ../vim-7.4.983/runtime/doc/eval.txt 2015-12-03 16:32:52.724051746
> +0100
> --- runtime/doc/eval.txt 2015-12-28 19:15:28.681011267 +0100
> ***************
> *** 5188,5201 ****
> move. No error message is given.
>
> {flags} is a String, which can contain these character flags:
> ! 'b' search backward instead of forward
> ! 'c' accept a match at the cursor position
> 'e' move to the End of the match
> 'n' do Not move the cursor
> ! 'p' return number of matching sub-pattern (see below)
> ! 's' set the ' mark at the previous location of the cursor
> ! 'w' wrap around the end of the file
> ! 'W' don't wrap around the end of the file
> If neither 'w' or 'W' is given, the 'wrapscan' option applies.
>
> If the 's' flag is supplied, the ' mark is set, only if the
> --- 5228,5242 ----
> move. No error message is given.
>
> {flags} is a String, which can contain these character flags:
> ! 'b' search Backward instead of forward
> ! 'c' accept a match at the Cursor position
> 'e' move to the End of the match
> 'n' do Not move the cursor
> ! 'p' return number of matching sub-Pattern (see below)
> ! 's' Set the ' mark at the previous location of the cursor
> ! 'w' Wrap around the end of the file
> ! 'W' don't Wrap around the end of the file
> ! 'z' start searching at the cursor column instead of zero
> If neither 'w' or 'W' is given, the 'wrapscan' option applies.
>
> If the 's' flag is supplied, the ' mark is set, only if the
> ***************
> *** 5203,5208 ****
> --- 5244,5255 ----
> flag.
>
> 'ignorecase', 'smartcase' and 'magic' are used.
> +
> + When the 'z' flag is not given seaching always starts in
> + column zero and then matches before the cursor are skipped.
> + When the 'c' flag is present in 'cpo' the next search starts
> + after the match. Without the 'c' flag the next search starts
> + one column further.
>
> When the {stopline} argument is given then the search stops
> after searching this line. This is useful to restrict the
> *** ../vim-7.4.983/src/version.c 2015-12-28 16:26:36.363773987 +0100
> --- src/version.c 2015-12-28 18:56:55.769207005 +0100
> ***************
> *** 743,744 ****
> --- 743,746 ----
> { /* Add new patch number below this line */
> + /**/
> + 984,
> /**/
I found a typo in src/testdir/test_searchpos.vim.
Please check and fix this.
Patch is attached.
Dear Bram>
Please take a rest :-)
--
Best regards,
Hirohito Higashi (a.k.a h_east)
--
--
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.
diff --git a/src/testdir/test_searchpos.vim b/src/testdir/test_searchpos.vim
index 4a1e024..8dffddc 100644
--- a/src/testdir/test_searchpos.vim
+++ b/src/testdir/test_searchpos.vim
@@ -15,10 +15,10 @@ func Test_searchpos()
call assert_equal([1, 3, 1], searchpos('\%(\([a-z]\)\|\_.\)\{-}xyz', 'pcW'))
" Now with \zs, first match is in column 0, "a" is matched.
- call cursor(1. 3)
+ call cursor(1, 3)
call assert_equal([2, 4, 2], searchpos('\%(\([a-z]\)\|\_.\)\{-}\zsxyz', 'pcW'))
" With z flag start at cursor column, don't see the "a".
- call cursor(1. 3)
+ call cursor(1, 3)
call assert_equal([2, 4, 1], searchpos('\%(\([a-z]\)\|\_.\)\{-}\zsxyz', 'pcWz'))
set cpo+=c