Andy Wokula schrieb:
> Nikolai Weibull schrieb:
>> On Jan 8, 2008 6:45 PM, Charles E Campbell Jr <[EMAIL PROTECTED]> 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
-~----------~----~----~----~------~----~------~--~---

Raspunde prin e-mail lui