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