Jak mogę automatycznie formatować / wciskać kod C w vimie?

250

Kiedy kopiuję kod z innego pliku, formatowanie jest pomieszane, jak poniżej:

fun()
{
for(...)
{
for(...)
{
if(...)
{
}
}
}
}

Jak mogę automatycznie sformatować ten kod w vimie?

Yongwei Xing
źródło
3
Dla każdego, kto chce sformatować, a nie tylko wciąć kod, druga odpowiedź (moja) rozwiązuje ten problem. Jeśli chcesz tylko poprawić wcięcie, zaakceptowana odpowiedź jest najprostsza.
Derek

Odpowiedzi:

566

Wypróbuj następujące naciśnięcia klawiszy:

gg=G

Objaśnienie: ggprzechodzi na początek pliku, =jest poleceniem do naprawy wcięcia i Gkaże mu wykonać operację do końca pliku.

Amir Rachum
źródło
28
powoduje to tylko wcięcie kodu. czy czegoś nie można zrobić, aby AUTOFORMATOWAĆ całość?
N 1,1
7
Jaka jest różnica?
Ton van den Heuvel
3
@Ton van: Zobacz moją różnicę (nie mogłem tego wyjaśnić w komentarzach).
Lazer
2
-1 Naprawia to tylko wcięcia, a nie formatowanie (o to proszono).
oligofren,
3
@oligofren Przykład OP zawierał tylko błędy wcięcia i akceptuje odpowiedź, więc myślę, że o to mu chodziło.
Amir Rachum,
78

Lubię korzystać z programu Styl artystyczny. Według ich strony internetowej :

Artistic Style to narzędzie do wprowadzania kodu źródłowego, formatowania i upiększania języków programowania C, C ++, C # i Java.

Działa w systemach Windows, Linux i Mac. Będzie robił takie rzeczy, jak wcięcie, zamiana tabulatorów na spacje lub odwrotnie, umieszczanie spacji wokół operacji, które lubisz (konwersja if(x<2)do, ( x<2 )jeśli tak to lubisz), umieszczanie nawiasów klamrowych w tej samej linii co definicje funkcji lub przenoszenie ich do wiersz poniżej itp. Wszystkie opcje są kontrolowane przez parametry wiersza poleceń.

Aby użyć go w vimie, po prostu ustaw dla niego opcję formatprg, a następnie użyj polecenia gq. Na przykład mam w moim .vimrc:

autocmd BufNewFile,BufRead *.cpp set formatprg=astyle\ -T4pb

więc za każdym razem, gdy otwieram plik .cpp, formatprg jest ustawiany z opcjami, które lubię. Następnie mogę wpisać gg, aby przejść na górę pliku igqG sformatować cały plik zgodnie z moimi standardami. Jeśli muszę ponownie sformatować tylko jedną funkcję, mogę przejść na górę funkcji, a następnie wpisać, gq][a ona sformatuje tylko tę funkcję.

Opcje, które mam dla astyle -T4pb, to tylko moje preferencje. Możesz przeglądać ich dokumenty i zmieniać opcje, aby formatować kod w dowolny sposób.

Oto demo. Przed astylem:

int main(){if(x<2){x=3;}}

float test()
{
if(x<2)
x=3;
}

Po astyle (gggqG):

int main()
{
    if (x < 2)
    {
        x = 3;
    }
}

float test()
{
    if (x < 2)
        x = 3;
}

Mam nadzieję, że to pomaga.

Derek
źródło
3
Czy jest coś takiego dla innych formatów; ruby, xml, json itp.?
derGral
1
@Ryan check vim-autoformat, patrz odpowiedź poniżej. BTW vim-autoformat wykorzystuje również astyle między innymi.
Chiel ten Brinke
1
Dziękuję Ci! Zaczynałem myśleć, że jestem jedyną osobą w tym słowie, która nie chciała, aby nawiasy otwierające znajdowały się w tym samym wierszu, co deklaracja funkcji!
user3640967
27

Wbudowane polecenie poprawnego wcięcia kodu zostało już wspomniane ( gg=G). Jeśli chcesz upiększyć kod, musisz użyć zewnętrznej aplikacji, takiej jak wcięcie . Ponieważ %oznacza bieżący plik w trybie ex, możesz go użyć w następujący sposób:

:!indent %
soulmerge
źródło
13

Wtyczka vim-autoformat umożliwia formatowanie bufora (lub jego wyboru) za pomocą jednego polecenia: https://github.com/Chiel92/vim-autoformat . Wykorzystuje do tego programy w formacie zewnętrznym, z rezerwą na funkcję wcięć vima.

Chiel ten Brinke
źródło
11

Uważam, że to clang-formatdziała dobrze.

W dokumentacji clang znajduje się kilka przykładowych skrótów klawiszowych

Wolę używać equalprgwiązania w vimie. Pozwala to wywoływać clang-formatz opcjami wcięcia G=gglub innymi =.

Wystarczy umieścić w pliku .vimrc następujące informacje:

autocmd FileType c,cpp setlocal equalprg=clang-format
Daniel
źródło
3
Najpierw musisz go zainstalować, np. Dla Ubuntu 16.04+:sudo apt install clang-format
Eric Wang
3

Może możesz wypróbować poniższe $ indent -kr -i8 * .c

Mam nadzieję, że Ci się przyda!

lattimore
źródło
3

Podoba mi się, indentjak wspomniano powyżej, ale najczęściej chcę sformatować tylko niewielką część pliku, nad którym pracuję. Ponieważ indentmożna pobrać kod ze standardowego wejścia, jest to naprawdę proste:

  1. Wybierz blok kodu, który chcesz sformatować Vlub tym podobne.
  2. Sformatuj, pisząc :!indent.

astyle zajmuje też standardowe wejście, więc możesz użyć tej samej sztuczki.

dsummersl
źródło
2

Chciałem dodać, że aby uniknąć pomyłki, w pierwszej kolejności możesz pisać :set pasteprzed wklejeniem. Po wklejeniu możesz wpisać :set nopastetakie rzeczy, jak js-beautify i wcięcia, aby znów działać.

atripes
źródło
1
Używam :set paste!do tego, który przełącza wartość wklejania zamiast ustawiania. Ułatwia to wyłączenie, ponieważ wystarczy przewinąć kilka poleceń wstecz i nacisnąć Enter.
a'r
0

Jest to narzędzie o nazwie indent. Możesz go pobrać za pomocą apt-get install indent, a następnie uruchomić indent my_program.c.

n0va_sa
źródło