Klawisz Tab == 4 spacje i automatyczne wcięcie po nawiasach klamrowych w Vimie


1265

Jak sprawić, by vi - Vim nigdy nie używał tabulatorów (przekształcanie spacji w tabulatory, źle!), Sprawia, że ​​klawisz tab == 4 spacje i automatycznie wcina kod po blokach nawiasów klamrowych, jak robi to Emacs ?

Jak zapisać te ustawienia, aby nigdy więcej ich nie wprowadzać?

Widziałem inne pytania z tym związane, ale zawsze wydaje się, że jest to trochę poza tym, czego chcę.


Odpowiedzi:


1881

Jak wskazano w kilku odpowiedziach poniżej, preferowaną metodą NIE jest teraz użycie smartindent, ale zamiast tego należy użyć (w .vimrc ):

filetype plugin indent on
" show existing tab with 4 spaces width
set tabstop=4
" when indenting with '>', use 4 spaces width
set shiftwidth=4
" On pressing tab, insert 4 spaces
set expandtab

W twoim pliku .vimrc :

set smartindent
set tabstop=4
set shiftwidth=4
set expandtab

Pliki pomocy potrzebują trochę czasu, aby się przyzwyczaić, ale im więcej czytasz, tym lepszy jest Vim:

:help smartindent

Co więcej, możesz osadzić te ustawienia w swoim źródle dla przenośności:

:help auto-setting

Aby zobaczyć bieżące ustawienia:

:set all

Jak graywh wskazuje w komentarzach, smartindent został zastąpiony przez cindent, który „działa sprytniej”, choć nadal głównie dla języków o składni podobnej do C:

:help C-indenting


4
Jeśli masz zestaw rozwijany, powinien on używać spacji. Czy również „ustawiasz kompatybilny”? Ma to różne skutki uboczne, w tym zresetowanie rozwinięcia do domyślnego ustawienia „wyłączony”
Ken

60
Przepraszamy, ale smartindent został zastąpiony przez cindent, który sam jest odpowiedni tylko dla składni w stylu C. Włączenie jednego z vimrc może stanowić problem podczas pracy z innymi językami. Zamiast tego użyj po prostu „wcięcia typu pliku”.
graywh

2
Cóż, smartindent jest również przeznaczony tylko dla składni w stylu C i jest zasadniczo przestarzały.
graywh

4
jeśli włączę expandtab, czy istnieje sposób na wprowadzenie znaku tabulacji w tekście?
Daniele Segato,

3
@DanieleSegato <ctrl v> <tab> powinien działać w trybie wstawiania: stackoverflow.com/questions/4781070/…
Ken

236

Powiązane, jeśli otworzysz plik, który używa zarówno tabulatorów, jak i spacji, zakładając, że masz

set expandtab ts=4 sw=4 ai

Możesz zastąpić wszystkie zakładki spacjami w całym pliku za pomocą

:%retab

10
Do Twojej wiadomości, jeśli nie chcesz, aby karta była zastępowana spacjami, usuń linię rozwinięcia.
Eno

6
Czy karty nie mają białych znaków? ;-)
Rob Wells

11
@ Rob-Wells: Zmieniłem „białe znaki” na „spacje”. Czy jesteś teraz szczęśliwy? ;-)
netjeff

Czy możesz wyjaśnić, co oznacza ta pierwsza linia?
Pozew funduszu Moniki,

2
rozwinąć określa, czy tabulatory są rozwijane do spacji. ts = tabstop = Liczba spacji, dla których liczy się <Tab> w pliku. sw = shiftwidth = Liczba spacji do użycia dla każdego kroku (automatycznego) wcięcia. ai = autoindent = Kopiuj wcięcie z bieżącej linii podczas rozpoczynania nowej linii.
mcmacerson

89

Najlepszym sposobem na uzyskanie wcięcia specyficznego dla rodzaju pliku jest użycie filetype plugin indent onw vimrc. Następnie możesz określić takie rzeczy, jak set sw=4 sts=4 etna przykład .vim / ftplugin / c.vim, bez konieczności tworzenia globalnych dla wszystkich edytowanych plików, a inne składnie typu innego niż C również będą poprawnie wcięte (nawet lisps) .


9
IMHO, lepsze niż odpowiedź, która została oznaczona jako poprawna. wcięcie typu pliku zastępuje cindent i smartindent.
0nt

62

Aby mieć tabulatory 4 spacji w większości plików, prawdziwy 8-znakowy tabulator w Makefiles i automatyczne wcięcia w różnych plikach, w tym C / C ++, umieść to w swoim ~/.vimrcpliku:

" Only do this part when compiled with support for autocommands.
if has("autocmd")
    " Use filetype detection and file-based automatic indenting.
    filetype plugin indent on

    " Use actual tab chars in Makefiles.
    autocmd FileType make set tabstop=8 shiftwidth=8 softtabstop=0 noexpandtab
endif

" For everything else, use a tab width of 4 space chars.
set tabstop=4       " The width of a TAB is set to 4.
                    " Still it is a \t. It is just that
                    " Vim will interpret it to be having
                    " a width of 4.
set shiftwidth=4    " Indents will have a width of 4.
set softtabstop=4   " Sets the number of columns for a TAB.
set expandtab       " Expand TABs to spaces.

Dlaczego nie potrzebujesz else? Wydaje mi się, że ostatnie wiersze nadpisują specyfikę makefile we wszystkich przypadkach
lucidbrot

6
Cześć @lucidbrot, instrukcja „autocmd FileType make” w zasadzie mówi vimowi pewne ustawienia, których należy użyć przy każdym otwarciu pliku Makefile. Natomiast linie poniżej to ustawienia domyślne. Innymi słowy, ustawienia „tabstop = 8 ...” zostaną zastosowane później, gdy plik zostanie otwarty, i zastąpią ustawienia „tabstop = 4 ...”, które mają zastosowanie przy inicjalizacji.
Shervin Emami,

56

W wielu systemach Linux, takich jak Ubuntu, .vimrcplik nie istnieje domyślnie, dlatego zaleca się, aby najpierw go utworzyć.

Nie używaj .viminfopliku, który istnieje w katalogu domowym. Jest używany do innego celu.

Krok 1: Przejdź do katalogu domowego

cd ~

Krok 2: Utwórz plik

vim .vimrc

Krok 3: Dodaj konfigurację określoną powyżej

filetype plugin indent on
set tabstop=4
set shiftwidth=4
set expandtab

Krok 3: Zapisz plik, naciskając Shift+ ZZ.


11
Nie używaj Shift + ZZgo spowoduje utworzenie pliku .swp. użyć wq.
shas

6
@shas: „ZZ” jest równoważne z „: x” , który jest taki sam jak „: wq”, z tym wyjątkiem, że zapisuje się tylko, jeśli plik został zmieniony ... (Ctrl-Z to inna historia ...)
Gert van den Berg

1
@shas To po prostu nieprawda. Jeśli nie chcesz pliku wymiany dla sesji edycji, musisz uruchomić vim -n <file>. Plik wymiany nie jest generowany w czasie oszczędzania; to prawie nie spełni swojego celu, ponieważ pliki wymiany stają się przydatne w odzyskiwaniu nagle przerwanych sesji edycji.
Kaz

32

Zalecanym sposobem jest użycie wcięcia opartego na typie pliku i użycie smartindent i cindent tylko wtedy, gdy to nie wystarczy.

Dodaj następujące elementy do pliku .vimrc

set expandtab
set shiftwidth=2
set softtabstop=2
filetype plugin indent on

Mam nadzieję, że to pomaga jako inna odpowiedź.


12

edytuj ~ / .vimrc

$ vim ~/.vimrc

dodaj następujące linie:

set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab


6

Automatyczne wcięcie jest oparte na bieżącym trybie składni. Wiem, że jeśli edytujesz Foo.java, to wpisując {i wciskając Enterwcięcia, następuje następujący wiersz.

Jeśli chodzi o zakładki, istnieją dwa ustawienia. W Vimie wpisz dwukropek, a następnie „set tabstop = 4”, co spowoduje, że tabulatory będą wyświetlane jako cztery spacje. Naciśnij ponownie dwukropek i wpisz „set expandtab”, który wstawi spacje dla tabulatorów.

Możesz umieścić te ustawienia w .vimrc (lub _vimrc w systemie Windows) w swoim katalogu domowym, więc musisz je wpisać tylko raz.


0

Po pierwsze, nie używaj Tabklucza w Vimie do ręcznego wcięcia. Vim ma parę poleceń w trybie wstawiania do ręcznego zwiększania lub zmniejszania wcięcia. Te polecenia to Ctrl-Ti Ctrl-D. Polecenia te przestrzegać wartości tabstop, shiftwidthaexpandtab , i utrzymywać właściwą mieszaninę przestrzeni i zakładek (maksymalna liczba zakładek następuje dowolny niezbędną liczbę spacji).

Po drugie, te ręczne klucze wcięcia nie muszą być i tak bardzo używane, jeśli używasz automatycznego wcięcia.

Jeśli Ctrl-Tzamiast TabCi przeszkadzać, możesz to zmienić:

:imap <Tab> ^T

Możesz także wykonać remap, Shift-Tababy wykonać Ctrl-Ddeindent:

:imap <S-Tab> ^D

^ T i ^ D to dosłowne znaki sterujące, które można wstawić jako Ctrl-VCtrl-T.

Po wprowadzeniu tego odwzorowania nadal możesz wpisać dosłowny Tab w buforze za pomocą Ctrl-VTab. Pamiętaj, że jeśli to zrobisz, nawet jeśli :set expandtabjest włączony, otrzymasz nierozwinięty znak tabulacji.

Podobny efekt do <Tab>mapy uzyskuje się przy użyciu :set smarttab, co również powoduje, że backspace na początku linii zachowuje się elegancko.

W smarttabtrybie, gdy nie Tabjest używany na początku linii, nie ma specjalnego znaczenia. To różni się od mojego powyższego mapowania Tabna Ctrl-T, ponieważCtrl-T użyte gdziekolwiek w linii (w trybie wstawiania) zwiększy wcięcie tej linii.

Inne przydatne mapowania mogą być:

:map <Tab> >
:map <S-Tab> <

Teraz możemy robić rzeczy takie jak zaznaczanie niektórych linii i naciskać, Tababy je wciąć. Lub naciśnij Tabdwukrotnie linię (w trybie komend), aby zwiększyć wcięcie.

Jeśli używasz odpowiednich poleceń zarządzania wcięcia, to wszystko jest kontrolowane przez trzy parametry: shiftwidth, tabstopi expandtab.

Ten shiftwidthparametr kontroluje rozmiar wcięcia; jeśli chcesz cztery wcięcia spacji, użyj :set shiftwidth=4lub skrót :set sw=4.

Jeśli tylko to zostanie zrobione, wcięcie zostanie utworzone przy użyciu kombinacji spacji i tabulatorów, ponieważ noexpandtabjest to ustawienie domyślne. Posługiwać się:set expandtab . Powoduje to, że znaki tabulacji, które wpisujesz do bufora, rozszerzają się w spacje, a wcięcia zarządzane przez Vima używają tylko spacji.

Kiedy expandtabjest włączony i jeśli zarządzasz swoim wcięciem poprzez wszystkie odpowiednie mechanizmy Vima, wartość parametru tabstopstaje się nieistotna. Kontroluje wygląd zakładek, jeśli zdarzają się one w pliku. Jeśli masz, set tabstop=8 expandtaba następnie podkradniesz twardy plik do pliku za pomocą Ctrl-VTab, spowoduje to wyrównanie do następnej 8-kolumnowej pozycji tabulacji, jak zwykle.


Wszystkie mapowania powinny używać wariantów nierekurencyjnych. Mapowanie go <C-t>może używać tej składni zamiast literałów. Wreszcie, mapowanie <Tab>w trybie normalnym również będzie mapowane <C-i>(są to ta sama postać), więc nie polecam tego (tracisz
sprytną

@ D.BenKnoble Nie polecam żadnego z tego; Sam używam Ctrl-T, Ctrl-D i <>. To używa Vima zgodnie z przeznaczeniem. Ludzie przyzwyczajeni do używania Tab w innych edytorach mogą tego nie lubić, to wszystko.
Kaz
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.