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.