2010-01-25 13 views
12

Załóżmy, że mam tego kodu:Wyrównaj tekst tylko w pierwszym separatorze w VIM

width: 215px; 
height: 22px; 
margin-top: 3px; 
background-color: white; 
border: 1px solid #999999; 

Chcę wyrównać to w ten sposób:

width:   215px; 
height:   22px; 
margin-top:  3px; 
background-color: white; 
border:   1px solid #999999; 

korzystając Align.vim mogę zrobić :Align \s używać spacji jako separator, ale posiada 2 problemy

  1. tiret początkowy podwaja
  2. wszystkie odstępy są uważane separatory, więc ostatnia linia jest pomieszane

Czytałem przez wiele opcji Align.vim ofert, ale nie znaleźli sposób, aby to zrobić.

+1

Dla małych, ale stosunkowo uniwersalnych sztuczek, które działają bez wtyczek, patrz [odpowiedź] (http://stackoverflow.com/a/7538363/254635) na pytanie "[Wstawianie wcięcia dla kolumn w Vimie] (http: //stackoverflow.com/q/7529029/254635) ". –

Odpowiedz

10

Jeśli używasz Tabular, możesz po prostu zrobić :Tabularize /:\zs/.

Patrząc na opis Align na vim.org, podobne wywołanie powinno działać. Możesz spróbować :Align :\zs. Nie używam Wyrównywania, więc nie jestem pozytywny.

+0

Tak, to działa z wyrównywaniem. Możesz użyć ': AlignCtrl l:' (lub podobnego), aby jakiekolwiek kolejne dwukropki zostały pominięte. –

+0

Wow dziękuję nie wiedziałem o wzorze \ zs ' –

+1

Czy ktoś mógłby wyjaśnić, co' \ zs' oznacza? – kizzx2

24

Możesz to zrobić za pomocą makra Vima, bez dodatkowych wtyczek. Umieść kursor w dowolnym miejscu na pierwszej linii, a następnie wpisz w trybie normalnym, a nie w trybie Insert:

qa0f:w100i <Esc>19|[email protected] 

zanotować pojedynczy przestrzeń po 100i i <Esc> środki „Press Escape” - nie pisz "<Esc>" dosłownie.

Tłumaczenie:

qa   -- record macro in hotkey a 
0   -- go to beginning of line 
f:   -- go to first : symbol 
w   -- go to next non-space character after the symbol 
100i <Esc> -- insert 100 spaces 
19|  -- go to 19th column (value 19 figured out manually) 
dw   -- delete spaces until : symbol 
j   -- go to next line 
q   -- stop recording macro 
[email protected]  -- run the macro 4 times (for the remaining 4 lines) 

I tak, użyłem podobnego makra sformatować powyższy blok kodu :)

Cf. my answer to a similar Vim alignment question.

Aby zastosować to do liczby linii w trybie wizualnym, należy wybrać i wpisać:

:[email protected] 
+4

świetnie, że podążyłeś za wyjaśnieniem - bez niego nie odważyłbym się wpisać tego magicznego zaklęcia z obawy przed moją zawartością duszy i dysku, ale dzięki temu dowiem się nawet kilku nowych rzeczy interesujących (aczkolwiek przewrotnie) Polecenia vim! – akavel

+1

@Aklavel I lol'd. – AlexMA

+2

@TalkLittle doskonałe wykorzystanie rozwiązania bez wtyczek, które nie wymaga żadnych dodatkowych dodatków Doskonałe wykorzystanie komentarza polecenia vim, aby pomóc nowym użytkownikom.Wszystkie dobre praktyki w obsłudze i wyjaśnianiu moc natywnego vim. – dreftymac

2

Wykorzystanie algorytmu @TalkLittle „s, to można zrobić z tym kodem, który jest trochę łatwiej oczy do mnie :)

  • dodać wystarczającą spcaes po pierwszym okrężnicy

    :%s/^[^:]:\zs/dużo przestrzeni/

  • ale jeśli naciśnięcie spacji cały czas boli kciuk, użyj zamiast tego

    :%s/^[^:]:\zs/\=repeat(' ',100)/

  • następnie usunąć wszystkie spacje po kolumnie 19

    :%s/\%19v\s*//

    UWAGA:% zrobi to we wszystkich liniach, podaj zakres, jeśli tego nie chcesz.

  • jeśli nie masz ochoty liczyć do 19, użyj tego:

    %s/:\zs.*// | %s/.*/\=len(submatch(0))/ | sort! n | let n=getline(1) | undo | echo 'the column nmuber of the right most ":" is' n

+1

dodatkowe punkty za rozwiązanie, które nie wymaga żadnych wtyczek – dreftymac

0

nadal można to zrobić z preferowanym wtyczki Align.vim z poleceniem:

Align! lp0P0: \s 

Align! oznacza, że ​​pierwszym argumentem jest format AlignCtrl, w którym zamawia się th Pierwszy mecz, który zostanie pozostawiony (l) wyrównany bez dopełnienia spacji (p0P0), a także chcesz pominąć (:) wszystkie kolejne mecze. Ten przykład można rozwinąć dla bardziej wyrafinowanych linii trasowania.

Powiązane problemy