Le mercredi 11 février 2015 17:13:12 UTC+1, Ben Fritz a écrit : > On Wednesday, February 11, 2015 at 3:26:14 AM UTC-6, Enno wrote: > > Le mardi 10 février 2015 09:22:35 UTC+1, Enno a écrit : > > > Hello, > > > > > > There is a thread on StackOverflow labelled > > > > > > "How to get visually selected text in VimScript" > > > > > > The naive and stable approach would be > > > > > > let old_reg = @v > > > normal! gv"vy > > > let raw_search = @v > > > let @v = old_reg > > > return raw_search > > > > > > but that only works if `set nosecure`. If `set secure` then > > > the functions become involved. I posted my own take at > > > > > > http://stackoverflow.com/questions/1533565/how-to-get-visually-selected-text-in-vimscript/28398359#28398359 > > > > > > but it handles neither block-wise selections nor multibyte columns. A > > > function that supports both is for example given at > > > > > > https://github.com/haya14busa/vim-asterisk/blob/4fda3a4d90926512fbb10eda8b7b0491c650eb5e/autoload/asterisk.vim#L163 > > > > > > Is there a simple solution at all? > > > > > > Enno > > > > Hello Ben, > > > > The function throws an error E523 that, by :help E523, appears only if > > &secure. > > > > To reproduce, put > > > > set secure > > fun! grep#GetVis() > > let old_reg = @v > > normal! gv"vy > > let raw_search = @v > > let @v = old_reg > > return raw_search > > endfun > > > > in ~/.vim/autoload/grep.vim > > > > and source > > > > set secure > > xnoremap <expr> * '/' . grep#GetVis() . '<CR>' > > > > Then hitting viw* throws > > > > Error detected while processing function grep#GetVis: > > line 2: > > E523: Not allowed here > > > > instead of searching for the selected text. > > Actually, the problem has nothing to do with the 'secure' option. Setting > nosecure gives the same result, if I correct your mapping: > > xnoremap <expr> * "\<Esc>/".GetVis()."\<CR>" > > The problem is not 'secure' but rather the fact that you're using :normal > inside an <expr> mapping. :help :map-<expr> says: > > > Be very careful about side effects! The expression is evaluated while > > obtaining characters, you may very well make the command dysfunctional. > > For this reason the following is blocked: > > - Changing the buffer text |textlock|. > > - Editing another buffer. > > - The |:normal| command. > > This alternate mapping works fine (although it is admittedly not as elegant): > > xnoremap * <Esc>/<C-R>=GetVis()<CR><CR>
Yeah, I thought that too, almost. That's where the deleted message above comes from. However, then I found out that it is rather the place of definition of GetVis(). The mapping xnoremap <expr> * '/'.grep#GetVis() . '<CR>' still gives, once `viw*` is hit the error message Error detected while processing function grep#GetVis: line 2: E523: Not allowed here as long as you use grep#GetVis() defined in ~/.vim/autoload/grep.vim and NOT a global function GetVis(). -- -- 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 [email protected]. For more options, visit https://groups.google.com/d/optout.
