Thanks for all the hints. The following seems to work:

:g/^==/s/^==\+ \(\w\+\).*/\=setreg('x',submatch(1))/ | :py i=eval
('@x');g=foo(i);current.line='%d;%d;%s===;' %(g.order(),g.size(),i)

it's ugly, but reliable. I agree we should have a pyeval or a special
compilation of vim to more easily handle this kind of thing.

Thanks!



On Sep 29, 11:55 pm, "Christian Brabandt" <cbli...@256bit.org> wrote:
> On Tue, September 29, 2009 11:55 pm, Reckoner wrote:
> > Is it possible to do something like:
>
> > :g/\(\w+\) .*/python foo(\1)
>
> > and then have all the matching lines changed to the output of the
> > python foo() function?
>
> > For example,
>
> > +--------------------------------
> > we are on line one
> > we are on line two
> > +--------------------------------
>
> > and given
>
> > def foo(x): return len(x)
>
> > we get
>
> > 2 are on line one
> > 2 are on line two
>
> > since the matching part ("we") has two letters.
>
> Well, I am no python expert, but in this special case I would use
> :%s/^\(\w\+\)/\=strlen(submatch(0))// which would use vims scripting
> language to do what you want. For more complex things, you can probably
> do something like this:
> :%...@^\(\w\+\)@\=substitute(system("echo " . shellescape(submatch(1)) . "|
> perl -pe 's/^(.*)/length $1/e' "), '\n', '', '')@
> (one line)
>
> Someone can probably suggest a similar command line for python. For more
> complex functions, you can write some code, that will be called
> when calling the interpreter.
>
> regards,
> Christian
--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_use" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---

Reply via email to