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

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

Raspunde prin e-mail lui