Loading ...
Sorry, an error occurred while loading the content.

Re: Allow expected getchar() behavior in maps

Expand Messages
  • Bram Moolenaar
    ... I think the idea at the time was that getchar() should not eat typeahead. I wonder what breaks if this patch is included. -- Looking at Perl through Lisp
    Message 1 of 2 , Aug 31, 2011
    • 0 Attachment
      James Vega wrote:

      > According to the help, using getchar() in an <expr> map should be avoided:
      >
      > - You can use getchar(), but the existing typeahead isn't seen and new
      > typeahead is discarded.
      >
      > I'm not sure this limitation is warranted.
      >
      > A while back, a user in #vim requested the ability to bracket i_Ctrl-r
      > with i_Ctrl-g_u so they could more easily undo their changes. My
      > immediate suggestion was:
      >
      > inoremap <expr> <C-r> "\<C-g>u\<C-r>".nr2char(getchar())."\<C-g>u"
      >
      > This actually works fine, unless you have another mapping that starts
      > with the same {lhs}. Using the following mappings (simplified for
      > testing):
      >
      > inoremap <expr> <C-r> nr2char(getchar())
      > inoremap <expr> <C-r>xl "foo"
      >
      > If I press <C-r>xa, I would expect to have xa inserted into the buffer.
      > Instead after <C-r>xa, getchar() is waiting for me to type a character.
      > So I type y and yxa gets inserted into the buffer.
      >
      > The xa that I typed to disambiguate the mapping was part of the existing
      > typeahead, so when the mapping finally gets triggered it is cached, I'm
      > prompted for a character (y) which is pushed onto the typeahead, and
      > then the previous typeahead is restored.
      >
      > If I instead wait for the mapping to timeout, everything works fine, but
      > having to wait for the timeout gets pretty annoying.
      >
      > This same behavior is what was causing the problem ZyX posted[0] about
      > some time ago and resulted in this TODO entry:
      >
      > Cannot use getchar() inside :normal and using an expression mapping. Is =
      > this
      > supposed to work? (XyX, 2010 Sep 22)
      >
      > So, I'm not really sure what stashing/restoring the typeahead is
      > supposed to protect against. I haven't seen a way to workaround that
      > stashing with my map disambiguation example and it seems to cause other
      > uses to break even when there aren't ambiguous maps involved. Based on
      > that, I propose the attached patch to remove that restriction.

      I think the idea at the time was that getchar() should not eat
      typeahead. I wonder what breaks if this patch is included.

      --
      Looking at Perl through Lisp glasses, Perl looks atrocious.

      /// Bram Moolenaar -- Bram@... -- http://www.Moolenaar.net \\\
      /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
      \\\ an exciting new programming language -- http://www.Zimbu.org ///
      \\\ help me help AIDS victims -- http://ICCF-Holland.org ///

      --
      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
    Your message has been successfully submitted and would be delivered to recipients shortly.