On Friday, April 6, 2012 5:04:19 PM UTC+2, Ben Fritz wrote:
> On Thursday, April 5, 2012 10:13:55 PM UTC-5, John Little wrote:
> > On Friday, April 6, 2012 10:02:48 AM UTC+12, Ben Fritz wrote:
> > > Please give the EXACT command you ran...
> > 
> > Perhaps this script will illustrate:
> > 
> >     let s = '-2 3-4-5-6-7-8'
> >     let p = '\([0-9-]\@<!-\)\?\d[0-9]*'
> >     let [start, end] = [0, 0]
> >     while 1
> >         let start = match(s, p, end)
> >         let end   = matchend(s, p, end)
> >         if start == -1
> >             break
> >         endif
> >         echo s[start : end-1]
> >     endwhile
> > 
> > I get:
> > 
> >     -2
> >     3
> >     -4
> >     -5
> >     -6
> >     -7
> >     -8
> > 
> > It would appear that using the third parameter to match() and matchend(), 
> > the match is done as if on a substring starting at the parameter, so the 
> > look behind assertion does not see what's there in the original string.
> > 
> > This is unlike searching in a buffer; the look behind assertion does look 
> > behind the start position of the search. Rameo, is this what you're getting 
> > at?
> > 
> 
> I think you've analyzed it perfectly! Looking closer at the help for match(), 
> I see:
> 
>               For a String, if {start} > 0 then it is like the string starts
>               {start} bytes later, thus "^" will match at {start}.  Except
>               when {count} is given, then it's like matches before the
>               {start} byte are ignored
> 
> So with only 3 arguments, from this help text, I would expect exactly the 
> results given, for the reason given.
> 
> However, this gave me a hint to fix the problem. With a minor tweak:
> 
>    let s = '-2 3-4-5-6-7-8'
>     let p = '\([0-9-]\@<!-\)\?\d[0-9]*'
>     let [start, end] = [0, 0]
>     while 1
>         " count=1 to ignore previous matches rather than making the string
>         " start at a new place
>         let start = match(s, p, end, 1)
>         let end   = matchend(s, p, end, 1)
>         if start == -1
>             break
>         endif
>         echo s[start : end-1]
>     endwhile
> 
> It works as intended. With this script, I get:
> 
> -2
> 3
> 4
> 5
> 6
> 7
> 8

Works great!
I adapted it in the function copymatches which I once found on wikia.com 
http://vim.wikia.com/wiki/Copy_the_search_results_into_clipboard 
and it works.
Hope it will work in all documents ;)


-- 
You received this message from the "vim_use" 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

Reply via email to