Tôi có hai cách tiếp cận tương tự. Không có cách nào để làm điều đó với lệnh viết sẵn, nhưng khá dễ dàng để tạo ra chức năng của riêng bạn mà nên làm những gì bạn muốn (và bạn có thể gọi nó là những gì bạn thích - ngay cả W nếu bạn muốn).
Một cách tiếp cận rất đơn giản mà sẽ chỉ xử lý khoảng single-line là phải có một chức năng như thế này:
command! -nargs=1 -complete=file -range WriteLinePart <line1>,<line2>call WriteLinePart(<f-args>)
function! WriteLinePart(filename) range
" Get the start and end of the ranges
let RangeStart = getpos("'<")
let RangeEnd = getpos("'>")
" Result is [bufnum, lnum, col, off]
" Check both the start and end are on the same line
if RangeStart[1] == RangeEnd[1]
" Get the whole line
let WholeLine = getline(RangeStart[1])
" Extract the relevant part and put it in a list
let PartLine = [WholeLine[RangeStart[2]-1:RangeEnd[2]-1]]
" Write to the requested file
call writefile(PartLine, a:filename)
endif
endfunction
này được gọi với :'<,'>WriteLinePart test.txt
.
Nếu bạn muốn hỗ trợ nhiều phạm vi dòng, bạn có thể mở rộng phạm vi này để bao gồm các điều kiện khác nhau hoặc bạn có thể ghim mã từ câu trả lời của tôi thành this question. Loại bỏ các bit về thay thế dấu gạch chéo ngược và sau đó bạn có thể có một chức năng rất đơn giản mà làm một cái gì đó như (chưa được kiểm tra mặc dù ...) này:
command! -nargs=1 -complete=file -range WriteLinePart <line1>,<line2>call writelines([GetVisualRange()], a:filename)
Tuyệt vời, điều này chính xác những gì tôi cần. Tôi chỉ cần một phạm vi duy nhất, nhưng thật tuyệt khi biết về giải pháp đa phạm vi nếu tôi cần trong tương lai. Cảm ơn, và Giáng sinh vui vẻ (hoặc Super Solstice, nếu Giáng sinh không phải là điều của bạn)! – Magnus