Позвольте мне предложить следующую реализацию.
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
Если в обозначениях диапазона гарантируется отсутствие пробелов вокруг чисел, второе утверждение ExpandRange()
можно упростить с помощью split()
function,
let n = split(@", '-')
Обратите внимание, что текст, обозначающий диапазон, помещается в безымянный регистр.Если желательно оставить регистр нетронутым, измените ExpandRange()
, чтобы предварительно сохранить его состояние, а затем восстановить.
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