Jak mogę autoformatować / wciąć kod C w Vimie?

Kiedy kopiuję kod z innego pliku, formatowanie jest popsute, tak:

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

Jak mogę autoformatować ten kod w Vimie?

Author: Jeffrey Bosboom, 0000-00-00

10 answers

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

gg=G

Explanation: gg idzie na górę pliku, = jest poleceniem poprawiającym wcięcie i G mówi mu, aby wykonał operację na końcu pliku.

 484
Author: Amir Rachum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-18 13:34:48

Lubię używać programu styl artystyczny. Według strony :

Artistic Style jest wcięciem kodu źródłowego, formaterem i upiększaczem dla języków programowania C, C++, C# i Java.

Działa w systemie Windows, Linux i Mac. Będzie to robić takie rzeczy jak wcięcia, zastępowanie tabulatorów spacjami lub odwrotnie, umieszczanie spacji wokół operacji, jak chcesz (konwersja {[3] } Na if ( x<2 ) Jeśli tak ci się podoba), umieszczanie klamer w tej samej linii, co definicje funkcji, lub przeniesienie ich do poniższej linii, itp. Wszystkie opcje są kontrolowane przez parametry wiersza poleceń.

Aby użyć go w Vimie, wystarczy ustawić na niego opcję formatprg, a następnie użyć polecenia gq. Więc, na przykład, mam w moim .vimrc:

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

Tak, że ilekroć otwieram a .plik cpp, formatprg jest ustawiony z opcjami, które lubię. Następnie mogę wpisać gg, aby przejść do góry pliku i gqg aby sformatować cały plik zgodnie z moim standardy. Jeśli muszę sformatować tylko jedną funkcję, mogę przejść do góry funkcji, następnie wpisz gq][ i sformatuje tylko tę funkcję.

Opcje, które mam dla astyle, -T4pb, to tylko moje preferencje. Możesz przejrzeć ich dokumenty i zmienić opcje formatowania kodu, jak chcesz.

Oto demo. Przed astyle:
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 pomaga.

 74
Author: Derek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-11 11:53:17

OP poprosił o automatyczne formatowanie, ale zaakceptował odpowiedź, która wykonuje tylko automatyczne wcięcia.

Oto różnica:

Oryginalny

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

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

AUTOINDENT

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

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

AUTOFORMAT

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

float test()
{
    if (x < 2)
        x = 3;
}
 51
Author: Lazer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-21 07:46:44

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 indent . Ponieważ % oznacza bieżący plik w trybie ex, możesz go użyć w następujący sposób:

:!indent %
 24
Author: soulmerge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-01 13:04:50

Wtyczka vim-autoformat umożliwia formatowanie bufora (lub zaznaczenia bufora) za pomocą jednego polecenia: https://github.com/Chiel92/vim-autoformat . używa do tego zewnętrznych programów formatujących, z funkcją wcięć Vima.

 13
Author: Chiel ten Brinke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-06 11:59:43

Uważam, że clang-format działa dobrze.

W dokumentacji clang

Wolę używać oprawy equalprg w Vimie. Pozwala to na wywołanie clang-format z G=gg lub innymi opcjami wcięć =.

Po prostu umieść następujące w swoim .plik vimrc:

autocmd FileType c,cpp setlocal equalprg=clang-format
 7
Author: Daniel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-27 02:34:18

Lubię indent jak wspomniano powyżej, ale najczęściej chcę sformatować tylko mały fragment pliku, nad którym pracuję. Ponieważ indent może pobierać Kod ze standardowego wejścia, jest to bardzo proste:

  1. wybierz blok kodu, który chcesz sformatować za pomocą V lub tym podobnych.
  2. Formatuj wpisując :!indent.

astyle bierze stdin zbyt, więc można użyć tej samej sztuczki tam.

 3
Author: dsummersl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-13 14:41:41

Może spróbujesz $indent-kr-i8 *.c

Mam nadzieję, że jest to przydatne dla Ciebie!

 2
Author: lattimore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-23 05:59:39

Chciałem dodać, że aby nie było to popaprane w pierwszej kolejności można wpisać :set paste przed wklejeniem. Po wklejeniu możesz wpisać :set nopaste, aby rzeczy takie jak js-beautify i wcięcia działały ponownie.

 1
Author: atripes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-02 09:01:47

Ich jest narzędziem o nazwie indent. Możesz go pobrać za pomocą apt-get indent, a następnie uruchomić indent my_program.c.

 0
Author: n0va_sa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-17 01:24:32