2010-01-15 43 views
13

Có lệnh nào để xác định độ dài của đường dài nhất trong vim không? Và để thêm chiều dài đó vào đầu tệp?dòng dài nhất trong vim?

+2

Điều này có được thực hiện trong Vim không? Tôi hỏi vì đây là một điều khá cụ thể để muốn làm, và có lẽ sẽ nhanh hơn khi đặt cùng một kịch bản Python/Perl/Ruby để thực hiện nếu bạn cần nó trên nhiều tệp. – ZoogieZork

+0

Điều này nghe giống như yêu cầu của bạn cho các giải pháp sai cho vấn đề thực tế. Chính xác là bạn đang cố đạt được điều gì? – soulmerge

+0

@ ZoogieZork: đôi khi vim là đủ, và đơn giản là đủ, không cần phải sử dụng các công cụ bên ngoài. –

Trả lời

18

Lệnh wc của Gnu có tùy chọn -L -max-line-length in ra độ dài dòng tối đa của tệp. Xem gnu man wc. Freebsd wc cũng có -L, nhưng không phải là - max-line-length, xem freebsd man wc.

Cách sử dụng chúng từ vim? Lệnh:

:%!wc -L 

Sẽ lọc tệp mở qua wc -L và làm cho nội dung của tệp có độ dài dòng tối đa.

Để giữ lại các nội dung tập tin và đặt dài dòng tối đa trên dòng đầu tiên làm:

:%yank 
:%!wc -L 
:put 

Thay vì sử dụng wc, Find length of longest line - awk bash mô tả làm thế nào để sử dụng awk để tìm chiều dài của dòng dài nhất.

Ok, bây giờ cho một giải pháp Vim nguyên chất. Tôi hơi mới để viết kịch bản, nhưng ở đây đi. Nội dung sau dựa trên hàm FilterLongestLineLength từ textfilter.

function! PrependLongestLineLength () 
    let maxlength = 0 
    let linenumber = 1 
    while linenumber <= line("$") 
    exe ":".linenumber 
    let linelength = virtcol("$") 
    if maxlength < linelength 
     let maxlength = linelength 
    endif 
    let linenumber = linenumber+1 
    endwhile 

    exe ':0' 
    exe 'normal O' 
    exe 'normal 0C'.maxlength 
endfunction 

command PrependLongestLineLength call PrependLongestLineLength() 

Đặt mã này vào tệp .vim (hoặc .vimrc) và: nguồn tệp. Sau đó, sử dụng lệnh mới:

:PrependLongestLineLength 

Cảm ơn bạn đã hiểu điều này thật thú vị.

+1

Tôi đã vào một cái gì đó như! Awk '{print (length ($ 0))}' stacker

+0

Thậm chí nếu Jonathan (pre-vim-7) giải pháp là một chút phức tạp, ông là đúng trong việc sử dụng 'virtcol()', tabulations sẽ không được tính là '1'. Tôi sợ tất cả các giải pháp khác dựa trên wc, awk, perl, vv sẽ không đưa ra câu trả lời đúng. –

5

Nếu bạn làm việc với các bảng biểu mở rộng, đơn giản

:0put=max(map(getline(1,'$'), 'len(v:val)')) 

là đủ.

Nếu không, tôi đoán chúng tôi sẽ cần những điều sau đây (mà bạn có thể tìm thấy như ví dụ cuối cùng trong :h virtcol(), trừ -1):

0put=max(map(range(1, line('$')), "virtcol([v:val, '$'])-1")) 
+0

Tôi sẽ không gọi dòng đó là "đơn giản". Nó hoạt động mặc dù, do đó, không có khiếu nại. – sleske

2

: wc -L%
hơn
:%! wc -L

Để thêm chiều dài đó vào đầu tệp:
: 0r! wc -L% | cut -d '' -f1

+0

Lợi thế của '%! Wc -L' là nó hoạt động trên bộ đệm chưa được lưu hoặc chưa được đặt tên. – wchargin

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