Как мне расширить диапазон в список в vimscript? - PullRequest
5 голосов
/ 25 января 2012

Я хотел бы автоматически взять визуально выбранный блок текста, такой как 51-100, и расширите его до 51,52,53,...,99,100.

Есть ли простой способ сделать это в vimscript?

1 Ответ

8 голосов
/ 25 января 2012

Позвольте мне предложить следующую реализацию.

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
...