2010-01-15 7 views
13

Vim'deki en uzun satırın uzunluğunu belirlemek için bir komut var mı? Ve bu uzunluğu dosyanın başında eklemek için?Vim en uzun çizgi?

+2

Bu Vim'de yapılmalı mı? Bunu sormak istiyorum çünkü bu yapmak için oldukça özel bir şey ve birden fazla dosya üzerinde ihtiyacınız varsa bunu yapmak için bir Python/Perl/Ruby komut dosyası koymak için muhtemelen daha hızlı olacaktır. – ZoogieZork

+0

Bu, asıl soruna yanlış çözümü sormanız gibi geliyor. Tam olarak ne elde etmeye çalışıyorsun? – soulmerge

+0

@ZoogieZork: Bazen vim yeterlidir ve yeterince basittir, harici alet kullanmaya gerek yoktur. –

cevap

18

Gnu's wc komutunun, dosyanın maksimum satır uzunluğunu basan bir -L --max satır uzunluğu seçeneği vardır. gnu man wc'a bakın. Freebsd wc'de de -L var, ama --max-line-length var, bkz. freebsd man wc.

Bunları vim'den nasıl kullanabilirim? Komut dosyası: Açık dosyayı wc-L üzerinden filtreleyecek ve dosyanın içeriğini maksimum satır uzunluğuna getirecektir. Find length of longest line - awk bash en uzun hat uzunluğunu bulmak için awk nasıl kullanılacağı açıklanır,

:%yank 
:%!wc -L 
:put 

yerine wc kullanmanın:

yapmak dosya içeriğini korumak ve ilk satırda maksimum hat uzunluğu koymak için.

Tamam, şimdi saf bir Vim çözümü için. Ben yazı yazmak için biraz yeni, ama işte burada. Aşağıdakiler, textfilter'dan FilterLongestLineLength işlevine dayanmaktadır.

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() 

Bu kodu .vim dosyasına (veya .vimrc) koyun ve: dosyayı gönderin. Daha sonra yeni komutu kullanın:

Teşekkürler, bunu anlamak çok eğlenceliydi. Basit

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

+1

Ben gibi bir şey vardı! Awk '{print (length ($ 0))}' stacker

+0

Jonathan (pre-vim-7) çözümü biraz karmaşık olsa bile, “virtcol()” ifadesinin kullanılması doğrudur, tablolamalar '1' olarak sayılmayacaktır. Korkarım ki, wc, awk, perl, vb. Tüm diğer çözümler doğru cevap vermeyecektir. –

5

genişletilmiş tabulasyonların çalışıyorsanız, yeterlidir.

Aksi takdirde, ben (eğer :h virtcol() son örneği olarak bulabiliriz, eksi -1) Aşağıdaki gerekecektir tahmin:

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

Bu satıra "basit" demezdim. Olsa da çalışır, bu yüzden hiçbir şikayetleri. – sleske

2

: wc -L%
yerine
:%! wc -L

Dosyanın başına bu uzunluğu eklemek için:
: 0r! wc -L% | cut -d '' -f1

+0

"%! Wc -L" nin avantajı, kaydedilmemiş veya adlandırılmamış arabelleklerde çalışmasıdır. – wchargin