2009-12-23 37 views
7

Tôi muốn sử dụng vim để viết một phần của tệp của tôi vào một tệp khác. Ví dụ, tôi có tập tin sau đây:Trong vim, làm thế nào để viết một phần dòng vào một tập tin?

This is line 1

and this is the next line

Tôi muốn tập tin đầu ra của tôi để đọc:

line 1

and this is

Tôi biết làm thế nào để sử dụng vi để viết một loạt các dòng vào một tệp:

:20,22 w partial.txt

Một cách khác là trực quan chọn văn bản mong muốn và sau đó viết:

:'<'> w partial.txt

Tuy nhiên, khi sử dụng phương pháp này, vim khăng khăng viết dòng đầy đủ trong đầu ra và tôi không tìm thấy cách nào để viết một dòng. Có suy nghĩ gì không?

Trả lời

5

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) 
+0

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

Các vấn đề liên quan