Tôi muốn tự động lấy một khối văn bản được chọn trực quan, chẳng hạn như 51-100
và mở rộng nó thành 51,52,53,...,99,100
.Làm cách nào để mở rộng phạm vi vào danh sách trong vimscript?
Có cách nào dễ dàng để làm điều này trong vimscript không?
Tôi muốn tự động lấy một khối văn bản được chọn trực quan, chẳng hạn như 51-100
và mở rộng nó thành 51,52,53,...,99,100
.Làm cách nào để mở rộng phạm vi vào danh sách trong vimscript?
Có cách nào dễ dàng để làm điều này trong vimscript không?
Hãy để tôi đề xuất triển khai sau.
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
Nếu nó được đảm bảo bằng các ký hiệu phạm vi đó không có khoảng trắng xung quanh số, báo cáo kết quả thứ hai của ExpandRange()
có thể được đơn giản hóa bằng cách sử dụng các split()
chức năng,
let n = split(@", '-')
Lưu ý rằng các văn bản biểu thị một phạm vi được đưa vào thanh ghi chưa đặt tên. Nếu nó thích hợp hơn là để lại thanh ghi bị ảnh hưởng, hãy sửa đổi ExpandRange()
để lưu trước và sau đó khôi phục trạng thái trước đó .
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