On Fri, Jun 26, 2015 at 11:33 AM, BPJ <b...@melroch.se> wrote:

> I have succeeded in writing a function which splits the contents of a
> visual selection on a pattern, reverses the resulting list, joins it
> together on a separator and puts the result back into the visual selection
> (Yes that's kind of basic, right?):
>
>     fun! RevList(...)
>         let reg_save=@@
>         let pattern=!exists('a:1') ? '\s*,\s*' : a:1
>         let sep=!exists('a:2') ? ', ' : a:2
>         normal gvy
>         let @@=join(reverse(split(@@,pattern)),sep)
>         normal gvp
>         let @@=reg_save
>     endfun
>
> What I want to do is to make this smart enough to not split on commas (or
> whatever) which are inside quotes, so how do I extract all substrings which
> match a pattern rather than split on a pattern, the equivalent of `my @list
> = $string =~ m/($pattern)/g` in Perl? (Hopefully a pattern like
> '\v%(%(\s*\,\s*)@!.)+' will match the non-quoted parts...)


     I think you want to split on any comma that is not preceded by
unbalanced quotation marks.   If you have to deal correctly with single and
double quotation marks, then I am not sure it can be done with regular
expressions.  As a starting point, see the notslash variable in
matchit.vim:
https://github.com/benjifisher/matchit.zip/blob/master/plugin/matchit.vim#L85
.  What you want is a lot more complicated.  I assume that escaped quotes,
like '\"', inside other quotes, do not count.

     Maybe you can work with something like this (after removing the
spaces, assuming \v):

( [^,] | " ( [^"] | notslash \\")* " | ' ( [^'] | notslash \\')* ' ){-} \zs
\s*,\s*

-- 
HTH
Benji Fisher

-- 
-- 
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

--- 
You received this message because you are subscribed to the Google Groups 
"vim_use" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_use+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to