Me gustaría tomar automáticamente un bloque de texto seleccionado visualmente, como 51-100
, y ampliarlo a 51,52,53,...,99,100
.¿Cómo puedo expandir un rango en una lista en vimscript?
¿Hay alguna manera fácil de hacerlo en vimscript?
Me gustaría tomar automáticamente un bloque de texto seleccionado visualmente, como 51-100
, y ampliarlo a 51,52,53,...,99,100
.¿Cómo puedo expandir un rango en una lista en vimscript?
¿Hay alguna manera fácil de hacerlo en vimscript?
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