2013-07-25 13 views
5

Załóżmy, że mamy plik (nowe linie oznaczone jako n ^)Jak znormalizować białe spacje dla bloku tekstu w vim?

aaaa^n 
         bbbb^n 
cccc^n 

istnieje proste polecenie zasypki odstępy w skrajnej prawej części bloku (prawdopodobnie stosując wybrane wzrokowa); Często widzę pytania o usunięcie wiodącą spacje, ale w tym przypadku chcę wiodącym spacje unormowanej do najdłuższego non-spacją w bloku, jak poniżej:

aaaa      ^n 
         bbbb^n 
cccc      ^n 
+1

Ciekawym, nieco pokrewnym problemem (i odpowiedzią) jest [Vim uzyska długość dopasowanej linii] (http://stackoverflow.com/q/13324093). – glts

+1

Zobacz także moje pytanie: http://stackoverflow.com/questions/10057562/create-virtualedit-block-around-selection – Reman

+0

Pobierz [wtyczkę tabelaryczną] (https://github.com/godlygeek/tabular). –

Odpowiedz

4

probaly najprostszym sposobem byłoby zrobić

set virtualedit=all 

Przejdź do lewego górnego rogu bloku, który chcesz wybrać. Użyj opcji wizualnej Blockwise (<C-V>) i wybierz odpowiednie linie. Następnie naciśnij $, aby rozszerzyć blok wizualny na koniec linii.

Następnie szarpać wybór z y

Następnie wpisz gvp do przeszłości, czego szarpnął linie z powrotem na to samo. (gv ponownie wybiera ostatni blok wizualny). Kiedy skończysz, spowoduje to rozciągnięcie wszystkich linii na długość najdłuższej linii + 1.

Powód, dla którego to działa. Podczas korzystania z edycji wirtualnej wybór wizualny rozszerza każdą linię na długość najdłuższą podczas umieszczania w rejestrze.

Spowoduje to dodanie dodatkowego miejsca do końca, który jest łatwo naprawić zz :%s/ $//

+1

+1 doskonały użytek ''virtualedit = all''. Zauważyłem, że działa to świetnie, z wyjątkiem dodania dodatkowej przestrzeni na końcu każdej linii. Łatwe ustawienie za pomocą ':% s /.$//'. –

+0

@PeterRincker tak, zauważyłem to również i szukałem miejsca, aby się go pozbyć. – FDinoff

+0

Myślę, że to dlatego, jak działa '$'. Zawsze mija jedno miejsce za ostatnim znakiem linii. Szkoda, że ​​nie było "g_" dla trybu bloków wizualnych. –

3

Można to zrobić w jednym :substitute, choć robi się trochę zaangażować:

:'<,'>s/$/\=repeat(' ', max(map(getline(line("'<"),line("'>")),'strdisplaywidth(v:val)'))-strdisplaywidth(getline('.')))/ 

ta komenda dotyczy wyboru wizualnego. Jeśli potrzebujesz większej kontroli nad zakresem, rozważ zawijanie zamiennika w funkcji akceptującej numer range.

Jak to działa?

  • \= w ciągu zastępowania pozwala ocenić wyrażenie: patrz :h sub-replace-expression.

  • Zamiennik jest liczbą znaków spacji: repeat(' ', ...).

  • Dokładna liczba znaków przestrzeni określa się jako różnicę pomiędzy

    • maksymalna długość przewodu w selekcji, max(map(getline(start,end), 'strdisplaywidth(v:val)')) i
    • szerokość linii bieżącej strdisplaywidth(getline('.')).

Zauważ, że strdisplaywidth() nie jest dostępna w starszych VIMS, ale konieczne jest, aby obsługiwać zarówno karty i spacji w linii prawidłowo. (Użyj strlen() jako taniego zamiennika.)

+0

To nie jest najlepsze rozwiązanie, moim zdaniem, ale jestem trochę pod wrażeniem tego polecenia. – ravron

+1

za jednorazową pracę, to trochę za dużo. jednak, jeśli operacja ta musi być wykonywana bardzo często, można to zapisać jako funkcję lub mapowanie, aby ta operacja była bardzo łatwa. po prostu wybierz wizualnie, a następnie naciśnij "ABC' +1! – Kent

+0

@Kent glts napisał funkcję i mapował, ale potem ją usunął. Sprawdź historię edycji, jeśli chcesz ją zobaczyć. – FDinoff

Powiązane problemy