Hi,

Thanks a lot for reply! Didn't know, that it is that elaborated to
do such things.
I will see, whether I will understand or ... ;)

Best regards,
mcc



ZyX <[email protected]> [11-01-17 19:00]:
> Reply to message «How to script a function, which reacts on visual blocks», 
> sent 19:50:39 17 January 2011, Monday
> by [email protected]:
> 
> >  any hint how to script a function, which also evaluate the
> >  limits of a visual block.
> > 
> >  How can I do this?
> You may find example under `:h g@' useful to accomplish this task. Here is 
> how I 
> may have written function that reverses order of characters in selection:
> 
>     function! OperatorFunc(type)
>         let savedselection=&selection
>         try
>             let [startline, endline]=[line("'["), line("']")]
>             if startline>endline
>                 let [endline, startline]=[startline, endline]
>             endif
>             if a:type==#'line'
>                 call setline(startline, map(range(startline, endline),
>                            \'join(reverse(split(getline(v:val), "\\zs")), 
> "")'))
>             elseif a:type==#'block'
>                 let savedureg=@"
>                 try
>                     let [startvcol, endvcol]=[virtcol("'["), virtcol("']")]
>                     for line in range(startline, endline)
>                         execute line
>                         execute "normal! ".startvcol."|v".endvcol."|d"
>                         execute "normal! i".join(reverse(split(@", '\zs')), 
> "")
>                     endfor
>                 finally
>                     let @"=savedureg
>                 endtry
>             else " if a:type==#"char"
>                 let savedureg=@"
>                 try
>                     execute "normal! `[v`]d"
>                     execute "normal! i".join(reverse(split(@", '\zs')), "")
>                 finally
>                     let @"=savedureg
>                 endtry
>             endif
>         finally
>             let &selection=savedselection
>         endtry
>     endfunction
>     function! SetOpfunc()
>         set operatorfunc=OperatorFunc
>         return "g@"
>     endfunction
>     nnoremap <expr> ,i SetOpfunc()
>     vnoremap <expr> ,i SetOpfunc()
> List of differencies between this function and example (excluding the fact 
> that 
> they do different things):
> 1. Using <expr> mapping made me able not to write different mapping for 
> visual 
> mode: the main problem is that entering command mode to set operatorfunction 
> like in example disables visual mode, but using SetOpfunc does not.
> 2. `nnoremap' and `vnoremap': you must use it when possible. Prevents 
> problems 
> which may occur if you have tons of mappings.
> 3. Using `try ... finally' to restore saved values: it handles case when user 
> interrupts your function before it proceed to the code that restores them.
> 
> Note that `exe "normal! i".text' is a quick and dirty solution which will 
> break 
> if text contains special characters.
> 
> Original message:
> > WARNING! VIM_SCRIPTING_NEWBIE AHEAD!
> > 
> > Hi,
> > 
> >  A few day before I have started to learn to script vim.
> >  I think, I understand to write "func! fun() range"-functions,
> >  which react on ranges, but I didnt find ( =! "there is no" ;)
> >  any hint how to script a function, which also evaluate the
> >  limits of a visual block.
> > 
> >  How can I do this?
> > 
> >  Thank you very much for any help in advance!
> >  Best regards,
> >  mcc



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