Automatyczne wcięcie spacji z C w vimie?

85

Byłem trochę zepsuty przy użyciu Eclipse i Java. Zacząłem używać vima do kodowania w C w środowisku linuxowym, czy jest sposób, aby vim automatycznie wykonywał odpowiednie odstępy między blokami?

Więc po wpisaniu a {następna linia będzie miała 2 spacje wcięte, a powrót w tej linii utrzyma ją w tym samym wcięciu, a} przesunie 2 spacje wstecz?

zxcv
źródło

Odpowiedzi:

134

Te dwa polecenia powinny to zrobić:

:set autoindent
:set cindent

Aby otrzymać dodatkowe punkty, umieść je w pliku o nazwie .vimrc znajdującym się w twoim katalogu domowym na Linuksie

davr
źródło
12
Poleciłbym również umieścić je w ~ .vim / ftplugin / c.vim, aby nie używać cindent przez cały czas, ale tylko dla plików C / C ++.
graywh
@graywh: A co z pl, php, cpp, as, java i wszystkimi innymi plikami, które chcę mieć takie same wcięcia? Czy muszę utworzyć osobny plik ustawień dla każdego z nich?
davr
17
Polegam na dołączonych skryptach wcięć Vima (: filetype indent on), co jest o wiele lepsze niż zwykłe używanie „cindent”.
graywh
3
dlaczego wcięcie typu pliku jest lepsze niż używanie cindent, jest dobrze wyjaśnione tutaj: vim.wikia.com/wiki/ ...
Jayen,
1
W przypadku automatycznego wcięcia możesz użyć skrótu: ustaw ai
Iam Zesh
56

I napisał o kartach w vim , co daje kilka ciekawych rzeczy, które nie zapytać. Aby automatycznie wciąć nawiasy klamrowe, użyj:

:set cindent

Aby wciąć dwie spacje (zamiast jednej tabulacji z ośmioma spacjami, vim domyślnie):

:set shiftwidth=2

Aby Vim nie konwertował ośmiu spacji na zakładki:

:set expandtab

Jeśli kiedykolwiek zechcesz zmienić wcięcie bloku tekstu, użyj <i>. Zwykle używam tego w połączeniu z trybem wyboru bloku (v, wybierz blok tekstu, <lub>).

(Spróbowałbym odwieść cię od używania wcięć z dwoma spacjami, ponieważ ja (i większość innych ludzi) trudno jest to przeczytać, ale to już inna dyskusja.

Commodore Jaeger
źródło
Bardzo fajny blog. Wciąż jestem nowy w vimie, ale miło wiedzieć, że są tam dobre zasoby.
zxcv
3
Oprócz zmiany biegów brakowało Ci również zmiany softtabstop.
graywh
8

Wiele funkcji Vima (takich jak autoindenti cindent) jest domyślnie wyłączonych. Aby naprawdę zobaczyć, co Vim może dla ciebie zrobić, potrzebujesz przyzwoitego ~/.vimrc.

Jest dobry starter $VIMRUNTIME/vimrc_example.vim. Jeśli chcesz to wypróbować, użyj

:source $VIMRUNTIME/vimrc_example.vim

kiedy w vimie.

Właściwie sugerowałbym po prostu skopiowanie zawartości do twojego, ~/.vimrcponieważ jest dobrze skomentowana i jest dobrym miejscem do rozpoczęcia nauki korzystania z vim. Możesz to zrobić przez

:e $VIMRUNTIME/vimrc_example.vim
:w! ~/.vimrc

Spowoduje to nadpisanie twojego prądu ~/.vimrc, ale jeśli wszystko, co tam masz, to ustawienia wcięć, które zasugerował Davr, nie przejmowałbym się tym, ponieważ przykładowy vimrc zadba o to również za ciebie. Aby zapoznać się z pełnym opisem przykładu i tym, co robi dla Ciebie, zobacz :help vimrc-intro.

rampion
źródło
6

Po prostu uruchom:

user@host:~ $ echo set autoindent >> .vimrc
JamesM-SiteGen
źródło
1
To nie ja zagłosowałem „w dół”, ale prawdopodobnie dlatego, że po prostu „set autoindent” nie powoduje automatycznego wcięcia po wpisaniu „{” i „}”, ani też nie ustawia automatycznie odstępów na 2 spacje. O to właśnie prosili.
Victor Zamanian,
3

Myślę, że najlepsza odpowiedź jest faktycznie wyjaśniona na wikii vim:

http://vim.wikia.com/wiki/Indenting_source_code

Pamiętaj, że odradza używanie opcji „set autoindent”. Najlepszą cechą ze wszystkiego, co znalazłem w tym wyjaśnieniu, jest możliwość ustawienia ustawień dla poszczególnych plików, co jest szczególnie przydatne, jeśli programujesz na przykład w Pythonie i C ++, ponieważ chciałbyś 4 spacje dla tabulatorów w pierwszym i 2 dla spacje w tym drugim.

user809472
źródło
0

i zawsze pamiętaj o tym czcigodnym wyjaśnieniu Spaces + Tabs:

http://www.jwz.org/doc/tabs-vs-spaces.html

mike511
źródło
2
O co chodzi z argumentem tego gościa? Nie rozumiem, jak nie używanie znaku TAB i zamiast tego wypełnianie zakodowanymi na stałe spacjami rozwiązuje problemy wszystkich. To uniemożliwiłoby na przykład otwarcie pliku i wyświetlanie szerokości jego wcięć zgodnie z własnymi preferencjami.
thomasrutter
1
Rozwiązanie tego gościa jest o wiele lepsze :) blogs.msdn.com/cyrusn/archive/2004/09/14/229474.aspx
thomasrutter
-1

Próbować:

ustaw sw = 2

ustaw ts = 2

ustaw smartindent

Craig B.
źródło
Według pomocy Cindent jest lepszy niż smartindent, ale działa tylko dla kodu podobnego do C.
thomasrutter
smartindent jest przestarzały (był tylko dla kodu podobnego do C). Znacznie lepsze są skrypty wcięcia typu pliku.
graywh
@graywh, poza wiki, które autorytatywne źródło podaje wycofany status smartindent?
memeplex 22.07.15