2010-03-24 19 views
31

Jestem raczej nowy w VIM. Mam kod źródłowy i to jest bałagan. Na pierwszy rzut oka chciałbym przynajmniej uzyskać przejrzysty i uporządkowany obraz kodu, więc lubię go poprawnie sformatować, mam na myśli wcięcie w zależności od głębokości funkcji i tak dalej.Czy możliwe jest formatowanie kodu C++ za pomocą VIM?

Zastanawiam się, czy można to zrobić z VIM, a inaczej inne narzędzia wywołania, które za to można polecić.

Dzięki

Odpowiedz

58

Podczas vim jest prawdziwy szwajcarski nóż ja wciąż wolą zewnętrznych narzędzi do pewnych zadań. Takie podejście jest czasami o wiele bardziej intuicyjne i łatwiejsze do zapamiętania niż użycie wbudowanego odpowiednika.

W przypadku Wcięcia, filtrować cały bufor pliku przez Astyle. Parametry astyle są znacznie łatwiejsze do uchwycenia w ciągu kilku minut, szczególnie jeśli nie jesteście guru vim. Również astyle zapewnia znacznie większą elastyczność w precyzyjnym dostosowywaniu wydajności.

Najpierw zainstaluj Astyle:
# apt-get install astyle

Następnie wewnątrz vim:
:%!astyle (prosta sprawa - domyślny tryb Astyle jest C/C++)
lub
:%!astyle --mode=c --style=ansi -s2 (ANSI C++ stylu korzystać z dwóch pomieszczeń na poziomie wcięcia)
lub
:1,40!astyle --mode=c --style=ansi (ANSI C++ styl, filtry tylko linie 1-40)

+4

Wow, to jest naprawdę świetne, bardzo dziękuję – flow

+0

Czy można odwzorować to na kombinację klawiszy, taką jak ctrl + shift + F? –

+4

Możesz także przesłonić operator wcięcia Vima ('='), aby użyć Astyle ustawiając 'equalprg' na astyle (np:' set equalprg = ~/astyle \ --style = google') – Parsa

26

można wykonać następujące czynności:

gg=G 
+1

Wyjaśnienie, = [ruch] wcięć regionu objętego ruchem. gg przesuwa się na początek pliku, a G przesuwa się na koniec pliku. – Sarah

+1

lub zacznij od 'V', aby wejść w tryb linii wizualnej, następnie przesuń w dół za pomocą' j', aby wybrać wszystkie linie, które chcesz sformatować, a następnie naciśnij '=' – hasen

+1

Nie lubię 'gg = G'. Czemu? Ponieważ po złamaniu długiej listy przecinkami (lista argumentów, długie booleany) przerwie ręczne wyrównanie. – Benoit

4

Vim na pewno to zrobić, chociaż wyniki nie mogą być idealne:

  1. Po pierwsze, należy zaznaczyć cały plik w wizualny tryb: ggVG
  2. Następnie naciśnij =, aby ponownie wyświetlić wszystko.

można dowiedzieć się więcej o jednakowej polecenia z: :help =

1

Ogólnym rozwiązaniem na wzór pomysłu m000 jest użycie UniversalIndentGUI jako narzędzia zewnętrznego.

+0

dzięki za informacje , ale ja wolę VIM, ponieważ muszę debugować kod na zdalnych komputerach. – flow

4

Jest vim plugin, który pozwala na formatowanie kodu od wewnątrz vim. To się nazywa vim-autoformat i można go pobrać tutaj:

https://github.com/Chiel92/vim-autoformat

Integruje zewnętrznych programów do formatowania kodu-vim. Na przykład, jeśli chcesz sformatować kod C, C++, C# lub Java, musisz zainstalować program astyle, a vim automatycznie ustawi go jako program formatujący.

2

Nie piszę kodu C++, ale napisałem kod Java.

Zamiast tego Vim obsługuje formatowanie niektórych popularnych języków. Ustawiłem skrót dla mnie, aby sformatować cały kod w buforze. To będzie powrót do linii I właśnie edytowanej :)

" format the file 
map <leader>fm gg=G'. 
0

prostu musiał rozwiązać dokładnie ten problem, więc pomyślałem, że przyczyniają się do ratowania innych trochę czasu.

Możesz użyć gg=G, aby wprowadzić wcięcie kodu. Ale rzeczy stają się trudne do zrozumienia w momencie, w którym chcesz poprawić sposób automatycznego wcięcia. Dlatego jeśli zależy Ci tylko na tym, że usunięto zbędne białe znaki i nie obchodzi ich styl formatowania, to jest to najszybszy sposób na zrobienie tego, ponieważ jest wbudowany.

Jeśli chcesz kontrolować styl (na przykład chcesz, aby kod był zgodny z a style guide), do przetworzenia pliku będzie potrzebne zewnętrzne narzędzie. Możesz wywołać to narzędzie z poziomu vim za pomocą: :%!<toolname> <options>. To potokuje plik za pomocą narzędzia i ponownie ładuje przetworzony wynik. (Możesz oczywiście użyć tego do wszystkiego, co chcesz zrobić do pliku)

Następne pytanie brzmi, jakie narzędzie zewnętrzne wybrać? Niezależnie od tego, metoda jest taka sama:

  1. Zainstaluj narzędzie wyboru
  2. się jej w drogę
  3. Dodaj linię do swojego pliku vimrc, który tworzy klawisz skrótu w obsłudze więc zaoszczędzić czas
  4. Użyj go.

Teraz, jakiego narzędzia używasz, zależy od stylu, który próbujesz skopiować. Jeśli próbujesz replikować szeroko używany styl, wtedy jest wszystko, czego potrzebujesz: astyle.

Jeśli starasz się replikować niestandardowy styl, a następnie trzeba będzie dwie rzeczy:

  1. UniversalIndentGui - przedni koniec, który pozwala bawić się z różnych opcji i live-podglądu ich wpływ na źródła złożyć
  2. zestaw narzędzi formatowania kodu źródłowego zainstalowanych w ścieżce

Między uncrustify i greatcode, powinieneś być w stanie całkowicie replikować żądany styl.

Właściwie to kłamałem. Jest inny sposób i nazywa się clang-format. Będziesz jednak chciał przeczytać dokumentację na jego temat i wciąż na wczesnym etapie, więc niektóre opcje nie działają zbyt dobrze. Jest to jednak piękne narzędzie (zdecydowanie najmądrzejsze z tego, ponieważ tworzy AST twojego kodu) i jest nawet dostępne dla Windows.

Jeśli masz zamiar poświęcić trochę czasu na przeczytanie instrukcji, sprawdź także GNU Indent.

Oczywiście, istnieje ostatnia droga, która faktycznie wymaga czasu, aby poznać zasady wcięcia vima i napisać dla swojego stylu. To zajmie trochę czasu, ale zadziała z gg=G.

Kilka uwag na Astyle vs Uncrustify vs GreatCode:

  1. Astyle jest dobre dla ogólnego formatowania, ale nie może robić takie rzeczy jak wyrównać deklaracji zmiennych i komentarze re-style bardzo dobrze.
  2. Uncrustify może zrobić wiele rzeczy, których nie może astyle, ale przygotuj się na zabawę, dopóki nie znajdziesz właściwej kombinacji opcji, których potrzebujesz. (Lub, jeśli masz ochotę tracić dużo czasu, użyj algorytmów genetycznych, aby znaleźć najlepszą kombinację opcji dla Twojego stylu, a kiedy udostępnisz kod i podasz mi link, bym mógł go również użyć :))

Pamiętaj, że nie musisz wybierać jednego narzędzia. W vimie możesz odwzorować jedno naciśnięcie klawisza, aby wykonać kilka kolejnych poleceń, więc teoretycznie możesz użyć kombinacji tych narzędzi, aby uzyskać dokładnie to, czego szukasz.

Last but not least, oto fragment z mojego pliku .vimrc, gdzie mam zmapowany F12, aby wywołać Astyle z niektórych opcji:

"A2 = attached brackets 
"-s8 indent 8 spaces 
"-xc attached braces to class declarations 
"-xj remove braces for single statement ifs and elses 
"-c convert tabs to spaces in the non-indentation part of the line 
map <F12> :%!astyle -A2 -s8 -xc -xj -c<CR> 

Nie oceniaj mnie na styl. Po prostu użyj tego narzędzia, aby odtworzyć to, co chcesz.

13

Gorąco polecam teraz format klang. Umożliwia on prostą integrację dzyń formacie do Vima, po zainstalowaniu dzyń-format:

http://clang.llvm.org/docs/ClangFormat.html#vim-integration

Jest to jedyny kod beautifier że naprawdę rozumie swój kod C++, a to jest naprawdę inteligentny, aby upiększyć kodu bardziej jak człowiek niż maszyna. Np .:

void TestFunction(int argument1, int argument2, 
        int argument3); 
void TestFunctionVeryLongName(int argument1, 
           int argument2, 
           int argument3); 
void TestFunctionWithRidiculouslyLongName(
    int argument1, int argument2, int argument3); 
+1

Alternatywą dla keybindingu sugerowanych w podręczniku formatu klang jest użycie wiązania 'equalprg' w vim. Pozwala to na wywołanie 'clang-format' z opcjami' G = gg' lub innymi '= '. Wystarczy umieścić w pliku '.vimrc': ' autocmd FileType c, cpp setlocal equalprg = format-klang' – Daniel

Powiązane problemy