2010-01-15 15 views
13

Czy istnieje polecenie ustalenia długości najdłuższej linii w vim? I dołączyć tę długość na początku pliku?najdłuższa linia w vimie?

+2

Czy trzeba to zrobić w Vimie? Pytam, ponieważ jest to dość konkretna rzecz, którą chciałbym zrobić i prawdopodobnie byłoby szybciej utworzyć skrypt Python/Perl/Ruby, aby to zrobić, jeśli potrzebujesz tego na wielu plikach. – ZoogieZork

+0

To brzmi jak twoja prośba o złe rozwiązanie rzeczywistego problemu. Co dokładnie próbujesz osiągnąć? – soulmerge

+0

@ZoogieZork: czasami vim jest wystarczający, a także wystarczająco prosty, nie ma potrzeby korzystania z zewnętrznych narzędzi. –

Odpowiedz

18

Polecenie wc zawiera polecenie -L --max-line-length, które wyświetla maksymalną długość linii pliku. Zobacz gnu man wc. FreeBSd wc ma również -L, ale nie - długość -max, patrz freebsd man wc.

Jak korzystać z nich z vim? Polecenie:

:%!wc -L 

Odfiltruje otwarty plik przez wc -L i sprawi, że zawartość pliku będzie miała maksymalną długość linii.

Aby zachować zawartość pliku i umieścić maksymalną długość wiersza w pierwszym wierszu zrobić:

:%yank 
:%!wc -L 
:put 

Zamiast WC, Find length of longest line - awk bash opisuje jak używać awk znaleźć długość najdłuższej linii.

Ok, teraz dla czystego rozwiązania Vima. Jestem trochę nowy w pisaniu skryptów, ale tu idzie. Poniżej znajduje się funkcja FilterLongestLineLength z 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() 

Umieść ten kod w pliku .vim (lub .vimrc) i: źródło pliku. Następnie użyj nowego polecenia:

:PrependLongestLineLength 

Dzięki, ustalenie tego było fajne.

+1

Byłem na czymś w rodzaju! Awk '{print (length ($ 0))}' stacker

+0

Nawet jeśli rozwiązanie Jonathana (pre-vim-7) jest nieco skomplikowane, ma rację używając 'virtcol()', tabulatory nie będą liczone jako '1'. Obawiam się, że wszystkie inne rozwiązania oparte na wc, awk, perlu itd. Nie dadzą prawidłowych odpowiedzi. –

5

Jeśli pracujesz z tablic wartości rozszerzonych, prosty

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

wystarczy.

W przeciwnym razie, myślę, że będziemy potrzebować następujące (które można znaleźć jako ostatni przykład w :h virtcol() minus 1):

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

Nie nazwałbym tej linii "prostą". Działa, ale nie ma skarg. – sleske

2

: wc -l%
zamiast
:%! wc -L

Aby dołączyć tę długość na początku pliku:
: 0r! wc -L% | cut -d '' -f1

+0

Zaletą '%! Wc -L' jest to, że działa na niezapisanych lub nienazwanych buforach. – wchargin