Hi Nikolay! On Sa, 09 Jan 2016, Nikolay Aleksandrovich Pavlov wrote:
> > > 2016-01-09 0:53 GMT+03:00 Christian Brabandt <[email protected]>: > > Hi, > I think I found an inconsistency. > > #v+ > vim -u NONE -N > :let @a='foobar' > :fu AB() > return "<c-r>a" > :endfu > :fu CD() > return "\<c-r>a" > :endfu > :imap <expr> ab '<c-r>a' > :imap <expr> cd AB() > :imap <expr> ef CD() > #v- > Now enter insert mode: > > 1) Inserting ab results in: > foobar > 2) Inserting cd results in: > <c-r>a > 3) Inserting ef results in: > foobar > > That is unexpected. I think the first case, it should also insert > '<c-r>a' Since according to the documentation (:h expr-quote) keys need > to be returned like "\<key>" in a double quoted string. > > How would one return the literal string "<c-r>a" in the first case? > Is this a bug or did I miss anything? > > > You miss how maps are parsed. When filling mappings table (i.e. at the time > :*map commands are parsed themselves) rhs always has special keys translated, > regardless whether it is <expr> or not. And only then, when you type > something, this is treated as expression. This way allows `:inoremap <expr> > foo > <SID>Func()` to work: `<SID>` must be translated before mapping is run because > mapping is run in the currently effective script context and not in the > context > of the script it was defined in (unlike :command does). > > To have literal string you need to escape `<` just as you will do in case of > other mappings: `'<LT>c-r>a'`. Or you may abstract this away in a function or > global variable. Ah thanks. I think this should be documented. Best, Christian -- Was eine Nation groß macht, sind nicht in erster Linie die großen Männer. Es ist das Format der Mittelmäßigen. -- José Ortega y Gasset -- -- 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 --- You received this message because you are subscribed to the Google Groups "vim_dev" 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.
