Zmiana zachowania wcięcia Vima według typu pliku

379

Czy ktoś mógłby mi wyjaśnić w prosty sposób najprostszy sposób zmiany zachowania wcięcia Vima w zależności od typu pliku? Na przykład, jeśli otworzę plik Python, powinien wciąć 2 spacje, ale jeśli otworzę skrypt Powershell, powinien użyć 4 spacji.

EBGreen
źródło
9
BTW - Konwencja PEP8 dla Pythona mówi, że tabstop powinien mieć 4 spacje, a tabulacje powinny mieć 4 spacje. ref: stackoverflow.com/questions/120926/…
cgseller

Odpowiedzi:

304

Możesz dodawać .vimpliki do wykonania, gdy vim przełączy się na określony typ pliku.

Na przykład mam plik ~/.vim/after/ftplugin/html.vim z tą zawartością:

setlocal shiftwidth=2
setlocal tabstop=2

Co powoduje, że vim używa tabulacji o szerokości 2 znaków do wcięcia ( noexpandtabopcja jest ustawiona globalnie gdzie indziej w mojej konfiguracji).

Jest to opisane tutaj: http://vimdoc.sourceforge.net/htmldoc/usr_05.html#05.4 , przewiń w dół do sekcji dotyczącej wtyczek typów plików.

SpoonMeiser
źródło
229
Zamiast tego powinieneś to włożyć ~/.vim/after/ftplugin/html.vim. Ale jak zauważyli inni, o wiele przyjemniej jest po prostu dodać autocmd FileType html setlocal shiftwidth=2 tabstop=2do swojego .vimrc.
Arystoteles Pagaltzis
10
Ups, właściwie to / is / gdzie mam ten plik. Naprawię odpowiedź. Nie zgadzam się jednak, myślę, że rozdzielenie poleceń dla różnych typów plików na osobne pliki sprawia, że ​​wszystko jest znacznie łatwiejsze, szczególnie jeśli masz wymagania dla wielu rodzajów plików lub wiele opcji dla niektórych rodzajów plików.
SpoonMeiser
3
Właściwie nie ma zbyt wiele powodów, aby używać katalogu after dla ftplugins. Vim załaduje wszystkie znalezione w ścieżce runtimepath, nie tylko pierwsze, jak w przypadku plików składniowych.
graywh
36
FYI: nie używaj js dla typu pliku javascript. Zamiast tego użyj javascript. ( autocmd FileType javascript setlocal shiftwidth=2 tabstop=2)
Kiddo,
13
Musisz także dodać filetype plugin ondo swojego vimrc.
gatoatigrado
191

Użyj ftplugins lub poleceń automatycznych, aby ustawić opcje.

ftplugin

W ~/.vim/ftplugin/python.vim:

setlocal shiftwidth=2 softtabstop=2 expandtab

I nie zapomnij włączyć ich w ~/.vimrc:

filetype plugin indent on

( :h ftpluginwięcej informacji)

autocommand

W ~/.vimrc:

autocmd FileType python setlocal shiftwidth=2 softtabstop=2 expandtab

Można zastąpić każdy z długich poleceń i ustawień z ich krótkimi wersjami:
autocmd: au
setlocal: setl
shiftwidth: sw
tabstop: ts
softtabstop: sts
expandtab:et

Sugerowałbym również poznanie różnicy między tabstopi softtabstop. Wiele osób nie wie o tym softtabstop.

graywh
źródło
1
Dzięki! Dziękuję również za ten kawałek o „ts” i „sts”. Czy są jakieś strony, które poleciłbyś omawiać tę różnicę i jak z niej korzystać?
jvriesem
11
@jvriesem Nie ma to wiele: „ts” to sposób wyświetlania znaków tabulacji; „sts” to ile „spacji” należy wstawić po naciśnięciu klawisza tab; „sw” to ile „spacji” należy użyć na poziom wcięcia; „et” oznacza, czy używać spacji, czy tabulatorów; „sta” pozwala wstawiać „sw” „spacje” po naciśnięciu tabulatora na początku linii.
graywh
10
Zastanawiam się, czy dla jasności lepiej byłoby użyć pełnych formularzy niż krótkiego zdania na końcu.
icedwater
23
swjest skrótem softwidth, stsjest skrótem softtabstop, etjest skrótem expandtab, setljest skrótem setlocali aujest skrótem autocmd. Możesz użyć długich formularzy zamiast krótkich formularzy.
Flimm
13
Wierzę, swże shiftwidthraczej się rozwija softwidth.
johncip
83

edytuj ~/.vimrci dodaj różne typy plików dla różnych wcięć, np. Chcę html/rbwcięcia na 2 spacje i js/coffeepliki wcięcia na 4 spacje:

" by default, the indent is 2 spaces. 
set shiftwidth=2
set softtabstop=2
set tabstop=2

" for html/rb files, 2 spaces
autocmd Filetype html setlocal ts=2 sw=2 expandtab
autocmd Filetype ruby setlocal ts=2 sw=2 expandtab

" for js/coffee/jade files, 4 spaces
autocmd Filetype javascript setlocal ts=4 sw=4 sts=0 expandtab
autocmd Filetype coffeescript setlocal ts=4 sw=4 sts=0 expandtab
autocmd Filetype jade setlocal ts=4 sw=4 sts=0 expandtab

zobacz: Ustawianie preferencji białych znaków Vima według rodzaju pliku

Siwei Shen 申思维
źródło
Komentarz do vimrc jest pojedynczy ":)
sdkks
@sdkks Nie sądzę. podwójny cytat to komentarz, pojedynczy cytat 'powoduje błąd na wszystkich wersjach mojego Linuxa. (7,3+, 8,0 ...)
Siwei Shen 申思维
Tak. Mój komentarz mówi: użyj jednego ", co oznacza, że ​​nie zamykaj go innym ". Nie jestem pewien, dlaczego to skomentowałem.
sdkks,
ok, źle cię zrozumiałem. Myślałem, że pojedynczy cytat oznacza, 'ale nie pozostawia "bez prawej " @. @
Siwei Shen 申思维
60

Umieść polecenia autocmd na podstawie sufiksu pliku w ~ / .vimrc

autocmd BufRead,BufNewFile   *.c,*.h,*.java set noic cin noexpandtab
autocmd BufRead,BufNewFile   *.pl syntax on

Polecenia, których szukasz, to prawdopodobnie ts = i sw =

Paul Tomblin
źródło
18
Jaka jest tego zaleta FileType?
Casey Chow,
3
Czy jest jakiś sposób na odwrócenie meczu?
SystemParadox
7
Miałem problemy z dostosowaniem typów plików do plików HTML (ponieważ plik .html nie jest tak naprawdę HTMLem, ale szablonowym plikiem HTML z językiem szablonów). Typy plików nie wydają się rozpoznawać go jako HTML, ale ta metoda to zrobi.
Mark Hildreth,
3
@digitxp - zaletą jest to, że używane rozszerzenie nie pasuje do zdefiniowanego „FileType”. Na przykład w mojej instalacji * .md oznacza typ pliku Modula2, a ja używam go do obniżania cen. Mógłbym (a) zmienić domyślne ustawienia FileType (b) zmienić ustawienia typu pliku za pomocą niestandardowej konfiguracji lub (c) szybko uzyskać to, czego chcę, używając tego ustawienia w moim 1. pliku vimrc, z którym poszedłem (c).
pdwalker
Warto zauważyć, że - zakładając, że mój szybki odczyt dokumentów jest poprawny - możesz w ten sposób dodać wiele poleceń dla każdego rodzaju plików i gwarantuje się, że zostaną wykonane w podanej kolejności.
underscore_d
23

Zwykle pracuję z expandtabsetem, ale to źle wpływa na makefile. Ostatnio dodałem:

:autocmd FileType make set noexpandtab

do końca mojego pliku .vimrc i rozpoznaje Makefile, makefile i * .mk jako makefile i nie rozwija kart. Prawdopodobnie możesz to przedłużyć.

Jonathan Leffler
źródło
Lepszą opcją jest włączenie: wtyczek typu pliku. Domyślny dla Vima to: setl noet, więc nawet nie potrzebujesz tego aucmd w swoim vimrc.
graywh
OK. Czy potrafisz wyjaśnić korzyści z tego związane i co się z tym wiąże? Dlaczego wtyczki typu pliku są lepsze niż autocmd? Kiedy należy używać autocmd? Nieużywany?
Jonathan Leffler
5
Wtyczki typu pliku, które są dostarczane z Vimem, na przykład robią przydatne rzeczy, takie jak „setlocal noexpandtab”. Polecenia automatyczne vs ftplugins dla rzeczy osobistych, takich jak shiftwidth, nie mają znaczenia - to tylko sposób, w jaki wybierasz strukturę swojej konfiguracji vima.
graywh
17

Osobiście używam tych ustawień w .vimrc:

autocmd FileType python set tabstop=8|set shiftwidth=2|set expandtab
autocmd FileType ruby set tabstop=8|set shiftwidth=2|set expandtab
Nello
źródło
22
Wiele języków ma już ustalone konwencje, podobnie jak niektóre firmy. Weź NodeJS jako przykład tego pierwszego. Tabulatory powinny mieć dwie spacje. Ból głowy i dość głupie, ale ważne.
Paul Hazen
3
Dlaczego zakładki powinny być takie same we wszystkich okolicznościach? W przypadku pliku konfiguracyjnego 8 kart spacji działa dobrze, ale w przypadku kodu z dużą liczbą wcięć 2 jest znacznie łatwiejsze do zarządzania. A potem są ustalone konwencje: node.js powinien mieć 2 tabulatory spacji, a python jest faktycznie składniowo niepoprawny z niczym innym niż 4 tabulatorami spacja.
felixphew
1
@ felixphew Python jest całkowicie poprawny z dowolną liczbą spacji (lub nawet tabulatorów), o ile pozostaje taki sam przez całą drogę.
James
@DJMcMayhem Masz rację - powinienem powiedzieć „zdecydowanie polecam”.
felixphew
1
+1 do Nello. Znak tab ma długą tradycję oznaczania skoku do następnej pozycji z wielokrotnością 8 znaków. Dzieje się tak tylko dlatego, że ludzie chcieli użyć tabulatora do „następnego wcięcia, które wygląda dobrze w moim języku” oraz dlatego, że niektóre edytory tekstu nie zawracały sobie głowy różnicą między „dodawaniem znaku tabulacji” i „dodawaniem spacji do wcięcia”, a ludźmi poprawiłem ich edytor, aby działał tak, że teraz mamy ten bałagan, w którym karty nigdy nie wyświetlają zamierzonego sposobu. Kod źródłowy to tekst, a standard dla tekstu to tabulacje 8-znakowe.
Florian F
6

Może to być znane większości z nas, ale tak czy inaczej (po raz pierwszy byłem zdziwiony): wykonanie :set et( :setrozwinięcie kart) nie zmienia kart już istniejących w pliku, trzeba to zrobić :retab. Na przykład:

:set et
:retab

i zakładki w pliku są zastąpione wystarczającą ilością spacji. Aby przywrócić zakładki, po prostu wykonaj:

:set noet
:retab
Juan Lanus
źródło
4

Dzisiaj możesz spróbować Editorconfig , jest też plugin vim . Dzięki temu możesz nie tylko zmienić rozmiar wcięcia w vimie, ale w wielu innych edytorach zachowaj spójne style kodowania.

Poniżej znajduje się prosta konfiguracja edytora, jak widać, pliki python będą miały 4 spacje dla wcięć, a pliki szablonów mopsów będą miały tylko 2.

# 4 space indentation for python files
[*.py]
indent_style = space
indent_size = 4

# 2 space indentation for pug templates
[*.pug]
indent_size = 2
chengbo
źródło
3

Chociaż możesz skonfigurować wcięcie Vima w porządku za pomocą wtyczki wcięcia lub ręcznie za pomocą ustawień, zalecam użycie skryptu python o nazwie Vindect, który automatycznie ustawia odpowiednie ustawienia po otwarciu pliku python. Użyj tej wskazówki, aby korzystanie z Vindect było jeszcze bardziej skuteczne. Kiedy po raz pierwszy rozpocząłem edycję plików Pythona utworzonych przez innych z różnymi stylami wcięć (tabulator a spacja i liczba spacji), było to niezwykle frustrujące. Ale Vindect wraz z tym plikiem wcięcia

Polecam również:

haridsv
źródło
2

Dla tych autocmd, którzy używają , najlepszą praktyką jest grupowanie ich razem. Jeśli grupa jest związana z wykrywaniem typu pliku, możesz mieć coś takiego:

augroup filetype_c
    autocmd!
    :autocmd FileType c setlocal tabstop=2 shiftwidth=2 softtabstop=2 expandtab
    :autocmd FileType c nnoremap <buffer> <localleader>c I/*<space><esc><s-a><space>*/<esc>
augroup end

Grupowanie pomaga utrzymać .vimrcporządek, zwłaszcza gdy z typem pliku skojarzonych jest wiele reguł. W powyższym przykładzie zdefiniowano skrót komentarza specyficzny dla plików .c.

Początkowe wywołanie autocmd!mówi vimowi, aby usunął wszelkie wcześniej zdefiniowane polecenia automatyczne we wspomnianym grupowaniu. Zapobiegnie to duplikowaniu definicji, jeśli .vimrczostanie ponownie pozyskane. Zobacz :help augroupwięcej informacji.

67hz
źródło
1

Używam narzędzia, które napisałem w języku C o nazwie autotab. Analizuje pierwsze kilka tysięcy wierszy załadowanego pliku i określa wartości parametrów Vima shiftwidth, tabstoporaz expandtab.

Kompiluje się to na przykład za pomocą gcc -O autotab.c -o autotab. Instrukcje integracji z Vimem znajdują się w nagłówku komentarza u góry.

Autotab jest dość sprytny, ale od czasu do czasu może się mylić, w szczególności przez to, że były niekonsekwentnie utrzymywane przy użyciu różnych stylów wcięcia.

Jeśli plik w oczywisty sposób używa tabulacji lub kombinacji tabulatorów i spacji do wcięcia, Autotab ustali, jaki rozmiar tabulacji jest używany, biorąc pod uwagę takie czynniki, jak wyrównanie elementów wewnętrznych wzdłuż kolejnych linii, takie jak komentarze.

Działa w różnych językach programowania i wybacza elementy „poza pasmem”, które nie są zgodne z przyrostami wcięć, takie jak dyrektywy C przetwarzania wstępnego, etykiety instrukcji C, nie wspominając o oczywistych pustych wierszach.

Kaz
źródło