vundle „wcięcie wtyczki typu pliku” wcina się w tabwidth

9

Wczoraj zainstalowałem vundle, a ponieważ to zrobiłem, szerokość tabulacji, którą skonfigurowałem w moim vimrc, jest ignorowana i ustawiana z powrotem na 4 zamiast 2.

Dowiedziałem się, że przyczyną tego jest następujący wiersz po akapicie pełnym:

filetype plugin indent on

Moje wcięcie jest ustawione w ten sposób:

set noexpandtab " Make sure that every file uses real tabs, not spaces
set shiftround  " Round indent to multiple of 'shiftwidth'
set smartindent " Do smart indenting when starting a new line
set autoindent  " Copy indent from current line, over to the new line

" Set the tab width
let s:tabwidth=2
exec 'set tabstop='    .s:tabwidth
exec 'set shiftwidth=' .s:tabwidth
exec 'set softtabstop='.s:tabwidth

Możesz sprawdzić mój pełny vimrc tutaj .

Testowałem problem wcięcia za pomocą skryptu python (gdzie wcięcie naprawdę ma znaczenie).

Próbowałem już zmienia filetype plugin indent onsię filetype plugin on, ale to niczego nie zmienia. Tylko komentowanie tej linii pomaga.
Teraz przewodnik instalacji Vundle mówi, że ta linia jest wymagana.

Jak rozwiązać ten problem z wcięciem? Czy mogę po prostu pominąć linię typu pliku, czy też naprawdę jest to konieczne, aby zachować ją w vimrc?

Rozwiązanie:

Dzięki @ChristianBrabandt i @romainl znalazłem rozwiązanie, które może również znajdować się w jednym pliku vimrc:

filetype plugin indent on

[...]

set noexpandtab " Make sure that every file uses real tabs, not spaces
set shiftround  " Round indent to multiple of 'shiftwidth'
set autoindent  " Copy indent from current line, over to the new line

" Set the tab width
let s:tabwidth=2
au Filetype * let &l:tabstop = s:tabwidth
au Filetype * let &l:shiftwidth = s:tabwidth
au Filetype * let &l:softtabstop = s:tabwidth
wullxz
źródło
Mimo że nie odpowiada na pytanie, próbowałem z wtyczką vim zamiast Vundle i działało idealnie ...
nobe4
2
Zobacz najczęściej zadawane pytania
Christian Brabandt
Możesz także użyć nowej komendy automatycznej OptionSet, aby zresetować ustawienie Shiftwidth i Softtabstop
Christian Brabandt

Odpowiedzi:

10

Najpierw najważniejsze; poniższy wiersz nie ma absolutnie nic wspólnego z zarządzaniem Vundle lub wtyczkami:

filetype plugin indent on

To polecenie robi trzy rzeczy:

  • umożliwia wykrywanie rodzaju pliku,
  • włącza skrypty specyficzne dla typu pliku (ftplugins),
  • włącza skrypty wcięcia specyficzne dla typu pliku.

Ta linia jest tam, ponieważ niektórzy menedżerowie wtyczek muszą upewnić się, że wykrywanie typu pliku jest wyłączone, zanim zaczną działać, a użycie Vima do programowania byłoby znacznie trudniejsze bez ftplugins i odpowiedniego wcięcia. Moim zdaniem powinny one po prostu zajmować się wykrywaniem typu pliku wewnętrznie, ale dobrze…

W każdym razie twój problem jest spowodowany przez nadmiernie zaborcze wtyczki ftp, które zastępują twoje ustawienia wcięcia z ich. Python ftplugin jest najczęstszym winowajcą, ponieważ nie tak dawno temu postanowiono wymusić PEP8.

Najłatwiejszym sposobem byłoby całkowite uniknięcie pobierania ftplugins:

filetype indent on

ale zwykle zawierają przydatne rzeczy, więc ta metoda nie jest tak naprawdę zalecana.

Najczystszym rozwiązaniem jest pozostawienie filetypelinii w stanie „optymalnym”:

filetype plugin indent on

i zastąp ich zastępowanie własnymi after/ftplugin/python.vim:

setlocal noexpandtab
setlocal shiftround
setlocal autoindent

let s:tabwidth=2
let &l:tabstop = s:tabwidth
let &l:shiftwidth = s:tabwidth
let &l:softtabstop = s:tabwidth

Uwagi:

  • Usunąłem, smartindentponieważ i tak nie jest to zbyt mądre i przestarzałe w przypadku skryptów wcięcia specyficznych dla typu pliku.
  • Zastąpiłem twoje :executepolecenia czystszymi :letpoleceniami, aby uniknąć niepotrzebnego łączenia.
romainl
źródło
1
Jeśli ustawisz shiftwidthzero i softtabstop-1, będzie on zgodny z ustawieniem tabstop.
Christian Brabandt
dziękuję za wyjaśnienia. Chciałbym zachować większość moich ustawień w moim vimrc, ponieważ chcę zsynchronizować je z wieloma komputerami. Użyłem twojego rozwiązania w moim vimrc i użyłem linku faq @ChristianBrabandt opublikowanego poniżej mojego pytania i działa. Zmodyfikuję moje pytanie, aby uwzględnić moje rozwiązanie.
wullxz
4

Problem z wcięciem pochodzi z ftplugin, który ładuje plik .vim, /usr/share/vim/vim-version-/ftplugin/-filetype-.vimktóry zastępuje wszystko, co masz w .vimrcpliku. możesz dowiedzieć się, gdzie jest ten plik, uruchamiając następujące polecenie w vimie :verbose set tabstop?. Dane wyjściowe wskażą plik, który przesłania konfigurację.

W moim przypadku miałem problemy z konfiguracją wcięcia w Pythonie.

Prostym sposobem na rozwiązanie tego jest wykonanie następujących czynności:

Utwórz folder .vim w folderze domowym (jeśli go nie masz)

cd ~/.vim
mkdir -p after/ftplugin/
cd ~/.vim/after/ftplugin/
vim python.vim

Dodaj następujące:

setlocal noexpandtab shiftwidth=4 softtabstop=4 tabstop=4

Zmodyfikuj, co chcesz w poleceniu. Mój wygląda tak, ponieważ pracuję z kartami zamiast białych znaków.

ysdelahoz
źródło