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

Re: Bug in @{reg} together with g@?

Expand Messages
  • Andy Wokula
    ... Ok, I was wrong. Vim *has* inputsave() and inputrestore(). nmap g: :set operatorfunc= ExRangeOp g@ let @a = g:}join final to be
    Message 1 of 7 , Jan 14, 2008
    • 0 Attachment
      Andy Wokula schrieb:
      > Nikolai Weibull schrieb:
      >> On Jan 8, 2008 6:45 PM, Charles E Campbell Jr <drchip@...> wrote:
      >>
      >>> It might help folks help you if you included the
      >>> get_command_mode_range() function.
      >> Ugh, yeah, I'm beginning to have a suspicion as to what the problem is:
      >>
      >> function! s:get_command_mode_range(type)
      >> let b = line("'[")
      >> let e = line("']")
      >>
      >> if b < e
      >> let range = '.,+' . (e - b)
      >> elseif b == e
      >> let range = '.'
      >> else
      >> let range = '.,+' . (b - e)
      >> endif
      >>
      >> call feedkeys(':' . range, 'n')
      >> endfunction
      >>
      >> I'm guessing that feedkeys() is the culprit here.
      >
      > Yes, feedkeys() puts its argument at the end of the input buffer, which
      > already contains the contents of register a.
      >
      > I think you have found a limit of g@ -- I wasn't able to find a solution
      > that keeps the elegance, now an additional _r in the recording is needed
      > to insert the range.
      >
      > Try this one (g: for Normal mode only):
      >
      > nmap g: :set operatorfunc=<sid>get_command_mode_range<CR>g@
      >
      > let @a = "g:}_rj\r"
      > " note: the final ^M causes an additional ^@ to be added to the
      > " register
      >
      > func! s:get_command_mode_range(type)
      > let b = line("'[")
      > let e = line("']")
      >
      > if b < e
      > let range = '.,+' . (e - b)
      > elseif b == e
      > let range = '.'
      > else
      > let range = '.,+' . (b - e)
      > endif
      >
      > exe "nmap _r :". range
      > endfunc
      >
      >
      > Problem:
      > If we use g@ in the {rhs} of a mapping for g: , we cannot add further
      > keys there, because Vim has no concept of place holders for the motion
      > the user has to type. Currently, the first few of the "further keys"
      > will be taken as the motion for g@ before continuing.

      Ok, I was wrong. Vim *has* inputsave() and inputrestore().

      nmap <silent> g: :set operatorfunc=<sid>ExRangeOp<CR>g@

      let @a = "g:}join"
      " final <CR> to be added

      func! s:ExRangeOp(type)
      let b = line("'[")
      let e = line("']")

      if b < e
      let range = '.,+' . (e - b)
      elseif b == e
      let range = '.'
      else
      let range = '.,+' . (b - e)
      endif

      call inputsave()
      call feedkeys(':'. range. "\<c-r>=''[inputrestore()]\r", 'n')
      endfunc

      --
      Andy

      --~--~---------~--~----~------------~-------~--~----~
      You received this message from the "vim_dev" maillist.
      For more information, visit http://www.vim.org/maillist.php
      -~----------~----~----~----~------~----~------~--~---
    Your message has been successfully submitted and would be delivered to recipients shortly.