On Thursday, May 2, 2013 11:29:48 PM UTC+9, Christian Brabandt wrote:
> Hi Ingo!
>
>
>
> On Do, 02 Mai 2013, Ingo Karkat wrote:
>
>
>
> > On 02-May-2013 15:34 +0200, Christian Brabandt wrote:
>
> >
>
> > > Hi mattn!
>
> > >
>
> > > On Mi, 01 Mai 2013, mattn wrote:
>
> > >
>
> > >> I wrote a patch to add new function 'capture()'.
>
> > >> When you want to get a list of all commands/functions/mappings with
> > >> using vim script, probably, you'll do like follow.
>
> > >>
>
> > >> ---------------------------------
>
> > >> let funcs = ''
>
> > >> redir => funcs
>
> > >> silent! function
>
> > >> redir END
>
> > >> ---------------------------------
>
> > >>
>
> > >> I guess, most of vim script programmers want to get the result as
> > >> expression. not command, want to get more easily.
>
> > >> If vim have 'capture()' which allow to getting those command line
> > >> 'function', I guess this is very useful.
>
> > >>
>
> > >> For example, getting :Command list as array.
>
> > >> ---------------------------------
>
> > >> :echo map(split(capture("command"), "\n")[1:], 'split(v:val[4:])[0]')
>
> > >> ---------------------------------
>
> > >>
>
> > >> One more thing. vim doesn't support nest of :redir.
>
> > >> ---------------------------------
>
> > >> function! s:foo()
>
> > >> let a = ''
>
> > >> redir => a
>
> > >> silent echo "foo"
>
> > >> redir END
>
> > >> return a
>
> > >> endfunction
>
> > >>
>
> > >> function! s:bar()
>
> > >> let a = ''
>
> > >> redir => a
>
> > >> call s:foo()
>
> > >> redir END
>
> > >> return a
>
> > >> endfunction
>
> > >>
>
> > >> echo s:bar()
>
> > >> ---------------------------------
>
> > >>
>
> > >> This 'echo s:bar()' doesn't show anything. But capture() can do it.
>
> > >
>
> > > Perhaps we should first fix redir before we introduce another similar
>
> > > function?
>
> >
>
> > That would work, too. On the other hand, here's an idea from a
>
> > practitioner that might justify a separate function: Almost always, the
>
> > captured text is split() into a list of lines (mattn's example does
>
> > this, too). Why not have capture() return a list of lines in the first
>
> > place?! We obviously cannot change the original :redir interface, but a
>
> > new function could offer this and spare all plugins from doing that.
>
>
>
> The patch throws out Warnings:
>
>
>
> eval.c: In function 'f_capture':
>
> eval.c:9305:16: warning: assignment from incompatible pointer type [enabled
> by default]
>
> gcc -c -I. -Iproto -DHAVE_CONFIG_H -I/usr/local/include -g -DDEBUG -Wall
> -Wshadow -Wmissing-prototypes -Wmaybe-uninitialized -o objects/main.o
> main.c
>
> In file included from vim.h:1965:0,
>
> from main.c:11:
>
> globals.h:1098:18: warning: 'capture_ga' initialized and declared 'extern'
> [enabled by default]
>
>
>
>
>
> This patch seems to fix those warnings:
>
> iff --git a/src/eval.c b/src/eval.c
>
> --- a/src/eval.c
>
> +++ b/src/eval.c
>
> @@ -9302,7 +9302,7 @@
>
> if (check_secure())
>
> return;
>
>
>
> - capture_ga = alloc(sizeof(garray_T));
>
> + capture_ga = (garray_T *) alloc(sizeof(garray_T));
>
> ga_init2(capture_ga, (int)sizeof(char), 80);
>
>
>
> ++msg_silent;
>
> diff --git a/src/globals.h b/src/globals.h
>
> --- a/src/globals.h
>
> +++ b/src/globals.h
>
> @@ -1095,7 +1095,11 @@
>
> EXTERN int redir_reg INIT(= 0); /* message redirection register */
>
> EXTERN int redir_vname INIT(= 0); /* message redirection variable */
>
> #endif
>
> -extern garray_T *capture_ga INIT(= NULL); /* capture() buffer */
>
> +EXTERN garray_T *capture_ga /* capture() buffer */
>
> +# ifdef DO_INIT
>
> + = NULL
>
> +# endif
>
> + ;
>
>
>
> I haven't played yet much with the capture() function, so I am not sure,
>
> this works recursively.
>
>
>
> It looks like a useful addition, but I am not sure, whether a new
>
> function is the right way to go, instead of fixing redir.
>
>
>
> Mit freundlichen Gr��en
>
> Christian
>
> --
>
> Auf der Verpackung steht: Win95, NT oder besser, folglich ist Linux
>
> eine unterst�tzte Plattform.
Ah, thank you.
--
--
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/groups/opt_out.