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?

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


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.


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.


6

Po prostu uruchom:

user@host:~ $ echo set autoindent >> .vimrc

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.


0

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

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


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.