On 14:49 Mon 01 Oct , Christian Brabandt wrote: > On Mon, October 1, 2012 13:16, Marcin Szamotulski wrote: > > On 09:20 Sun 23 Sep , Marcin Szamotulski wrote: > >> Hello > >> > >> The c_CTRL-\_e (<C-\>e) maps inside expression register are not working. > >> There is a very nice emacscommandline > >> (http://www.vim.org/scripts/script.php?script_id=3554) > >> plugin which defines lots of nice maps in this way, but then when one > >> tries to write to expression register one gets errors. The minimal setup > >> to reproduce this is: > >> > >> fun X() > >> return 'echo "X"' > >> endfun > >> cnoremap X <C-\>eX()<CR> > >> > >> Now please try in insert mode: > >> <c-r>=X > >> and after pressing X I get the following error: > >> E15: invalid expression: ^eX() > >> E15: invalid expression: ^eX() > >> > >> I got it twice. I think it would be nice to have the <C-\>e maps > >> working inside expression register (and in this case it would be nice of > >> vim script knew it, for example through including the '=' into to > >> getcmdline()) or to disable the <C-\>e maps inside the expression > >> register. > >> > >> Best regards, > >> Marcin > > > > In case somebody will stumble across this post, the solution that > > I found for this is to define another map: > > cnoremap <C-b> <C-R> > > etc ... . It will not trigger the emacscommand line maps. One just has > > to remember to not to use <C-W> while entering things into the > > expression register (which is used rarely, so there is not much > > opportunity to learn it, and lots of chances to forget it ;) > > > > But this is far from perfect. > > Would it be enough to simply disallow mappings in expression evalution mode? > > diff --git a/src/ex_getln.c b/src/ex_getln.c > --- a/src/ex_getln.c > +++ b/src/ex_getln.c > @@ -1128,7 +1128,6 @@ > i = Ctrl_R; /* CTRL-R CTRL-O == CTRL-R CTRL-R */ > if (i == Ctrl_R) > c = plain_vgetc(); /* CTRL-R CTRL-R <char> */ > - --no_mapping; > #ifdef FEAT_EVAL > /* > * Insert the result of an expression. > @@ -1136,6 +1135,10 @@ > * a new one... > */ > new_cmdpos = -1; > + /* allow special keys like BS, but don't allow mappings. > + * prevents from trying to evaluate c_Ctrl-\_e mappings > + * where the ctrl-\ e makes the following expression invalid */ > + ++allow_keys; > if (c == '=') > { > if (ccline.cmdfirstc == '=')/* can't do this recursively */ > @@ -1150,7 +1153,10 @@ > restore_cmdline(&save_ccline); > } > } > -#endif > + --allow_keys; > +#endif > + --no_mapping; > + > if (c != ESC) /* use ESC to cancel inserting register */ > { > cmdline_paste(c, i == Ctrl_R, FALSE); > > > regards, > Christian
Thanks! It works like a charm. Best, Marcin Szamotulski -- 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
