2012-01-25 14 views

Respuesta

8

Déjenme proponer la siguiente implementación.

vnoremap <silent> <leader># :<c-u>call ExpandRange()<cr> 
function! ExpandRange() 
    norm! gvy 
    let n = matchlist(@", '\(\d\+\)\s*-\s*\(\d\+\)')[1:2] 
    if len(n) != 2 || +n[0] > +n[1] 
     return 
    end 
    exe 'norm! gvc' . join(range(n[0], n[1]), ',') 
endfunction 

si se garantiza por la notación de rango que no hay espacio en blanco alrededor de números, la segunda declaración de ExpandRange() se puede simplificar mediante el uso de la función split(),

let n = split(@", '-') 

Tenga en cuenta que el texto denotar un rango se coloca en el registro sin nombre. Si es preferible dejar intacto el registro, modifique ExpandRange() para guardar su estado de antemano y restaurelo después.

function! ExpandRange() 
    let [qr, qt] = [getreg('"'), getregtype('"')] 
    norm! gvy 
    let n = matchlist(@", '\(\d\+\)\s*-\s*\(\d\+\)')[1:2] 
    call setreg('"', qr, qt) 
    if len(n) != 2 || +n[0] > +n[1] 
     return 
    end 
    exe 'norm! gv"_c' . join(range(n[0], n[1]), ',') 
endfunction 
Cuestiones relacionadas