Vim: zastosuj ustawienia do plików w katalogu

103

Jak określić ustawienia Vima dla wszystkich plików w bieżącym katalogu?

Idealnym rozwiązaniem byłoby, gdyby Vim szukał i czytał plik .vimrc w bieżącym katalogu przed wyszukaniem ~ / .vimrc i stosował tam ustawienia dla całego drzewa.

Widziałem wtyczkę , ale oznacza to, że zastosowane ustawienia nie są przezroczyste, ponieważ wymagają zainstalowania wtyczki. W przeciwieństwie do tego, modeline jest przezroczysty, ponieważ niezależnie od vimrc użytkownika lub konkretnego wywołania vim, ustawienia modeline zostaną zastosowane do tego pliku.

Próbowałem

  • umieszczenie .vimrc w katalogu roboczym
  • :so vimrc w modelinie.

Przypuszczam, że oba nie działają ze względów bezpieczeństwa. Nie potrzebuję pełnej mocy vimrc; wystarczy przywiązanie do ustawień akceptowanych przez modelinę. Moim celem jest ułatwienie vimmersom przyjęcia standardów kodowania w projekcie.

wilhelmtell
źródło

Odpowiedzi:

42

Jestem zwolennikiem sposobu korzystania z wtyczek . Z kilku powodów:

  • Modelines są szczególnie ograniczone: nie możemy ustawiać zmiennych (które dostrajają inne (ft) wtyczki, np. "Czy nawiasy klamrowe for-snippet powinny znajdować się w nowej linii?") Ani wywoływać z nich funkcji (nie ograniczam się do standardów kodowania, ustawiłem również makefile do użycia w zależności od bieżącego katalogu)
  • DRY : w przypadku modeli należy powtórzyć ustawienie w każdym pliku, jeśli jest zbyt wiele rzeczy do ustawienia lub strojenia do zmiany, szybko stanie się to trudne do utrzymania, ponadto będzie wymagało użycia wtyczki template-expander ( co powinieneś wziąć pod uwagę, jeśli masz kilka vimmerów w swoim projekcie).
  • Nie każdy używa Vima do tworzenia. Nie chcę przeszkadzać innym osobom w ustawieniach edytora, dlaczego mam pasożytować na ich?
  • Łatwiej jest poprosić vimmerów o zainstalowanie tej samej wtyczki, zamiast prosić ich o kopiowanie-wklejanie i utrzymywanie tych samych wierszy w ich .vimrc
  • Ustawienia można zapisać z innymi plikami projektu (cvs / svn / git / cokolwiek)
  • Naprawdę łatwo jest mieć plik konfiguracyjny na projekt - z wtyczką mam globalny plik konfiguracyjny dla standardów kodowania całego projektu i określone pliki konfiguracyjne dla każdego podprojektu (którego makefile użyć, który plik wykonywalny do wywołania , ...)

Przy okazji, rozwiązanie sth może zostać użyte do pozyskania pojedynczego pliku konfiguracyjnego. Jest to bardzo podobne do podejścia z wtyczkami, z wyjątkiem tego, że .vimrc musi być obciążony nie globalnymi opcjami i nie obsługuje łatwo wielu / współdzielonych plików konfiguracyjnych.

Luc Hermitte
źródło
Zauważyłem, że musisz zapisać nowy plik w ścieżce, zanim poprawnie uruchomi wtyczkę
cmcginty
W rzeczy samej. Ta rodzina wtyczek definiuje tylko ramy. Nadal musisz zapisać definicje specyficzne dla projektu w pliku - które framework będzie automatycznie pobierał.
Luc Hermitte
1
Uwaga, Luc łączy własną wtyczkę. Wydaje się, że działa to znacznie lepiej niż ten, o którym mowa w pytaniu. Dzięki.
dane z
Dobrze. Nie potrafię powiedzieć. Ponieważ używam swojego od lat, nigdy nie przyjrzałem się bliżej innym implementacjom. Od czasu do czasu otrzymuję raport o błędzie, który ostatecznie uwzględniam. Przy okazji, moja wersja jest zaimplementowana tak, aby była uruchamiana przed szablonem mu, aby ustawić zmienne specyficzne dla projektu przed rozszerzeniem szablonów (co jest bardzo przydatne do pobrania bieżącego katalogu głównego projektu i przycięcia go z rozwiniętych
nazw
1
@JasonMcCarrell Moja implementacja local_vimrc i Markusa "embear" Brauna obsługuje czarną listę, białą listę ... Jeśli potrzebujesz tylko określić, jak wykonywane są wcięcia, może być lepszym wyborem wtyczki EditorConfig-vim.
Luc Hermitte,
91

Możesz wstawić coś takiego $VIM/vimrc

autocmd BufNewFile,BufRead /path/to/files/* set nowrap tabstop=4 shiftwidth=4
sth
źródło
1
To jest rekurencyjne, ale tylko z *. Jeśli spróbujesz zredukować go do / path / to / files / lub / path / to / files, to nie zadziała.
SystemParadox
Jest to świetne, jeśli twój projekt ma drzewo plików napisane za pomocą "noexpandtab" i inne drzewo ze wszystkimi plikami "expandtab" (np. CodeIgniter). Możesz ustawić odpowiednią akcję dla plików w każdym drzewie indywidualnie za pomocą jednego pliku konfiguracyjnego.
user9645
2
Co dziwne, to nie zadziałało, gdy moja ścieżka zawierała łącze symboliczne; Musiałem umieścić pełną ścieżkę bez dowiązań symbolicznych, zanim zadziała.
Dolan Antenucci,
Zobacz odpowiedź joseph07 na temat używania "zaufanego vimu" jako alternatywy, odwrócenie tego podejścia (rozproszone .vimrc vs scentralizowane).
Nathan Schulte
50

Zdecydowanie radzę nie używać set exrc

Nawet z set secure* nix, vim nadal będzie uruchamiał autokomendy, powłokę i inne, jeśli jesteś właścicielem pliku. Więc jeśli zdarzyło ci się edytować plik w tym archiwum, wysłałem ci .vimrczawierający:

autocmd BufEnter * :silent! !echo rm -rf ~/

prawdopodobnie będziesz mniej rozbawiony niż ja.

fen
źródło
6
Odnosi się to również do wtyczek, które są automatycznie uruchamiane po załadowaniu vima.
Luc Hermitte
31

To pytanie jest stare, ale wydaje się całkiem naturalne i trwałe.

Moje rozwiązanie jest dość proste. Umieszczam .vimrcplik w katalogu głównym moich projektów. Pierwsza linia .vimrcpliku zwykle zawiera źródła ~/.vimrc, a następnie dodaje określoną konfigurację, którą chcę. Pseudonim tvim='vim -u .vimrc'i używam tvimw moich osobistych katalogach projektów. „tvim” oznacza „zaufany vim”, co oznacza, że ​​jeśli wykonam go w katalogu zawierającym .vimrcplik i coś pójdzie nie tak, winić można tylko siebie, ponieważ wyraźnie powiedziałem, że mu ufam. Przechowuję również grupę tych plików, aby czasami móc po prostu połączyć programowo ten, który chcę, do określonego rodzaju projektu.

joseph07
źródło
1
Takie podejście jest proste i doskonale pasuje do moich potrzeb.
Jinxed
Kiedy próbuję tego i source $HOME/.vimrcz mojego lokalnego .vimrc, Vim narzeka, że ​​nie może znaleźć moich wtyczek zainstalowanych w całym systemie (w tym przypadku patogen; execute pathogen#infect()polecenie na górze $HOME/.vimrcnie działa Unknown function ...). Jak mogę to naprawić?
Nathan Schulte
20

Umieszczanie .vimrc w katalogu roboczym jest faktycznie obsługiwane, tylko domyślnie wyłączone. Zobacz :h 'exrc'i :h startuppo szczegóły ustawienie 'exrc'umożliwi odczyt .vimrcz bieżącego katalogu.

Zaleca się również :set securepodczas korzystania z tego. To blokuje :autocmd, powleka i zapisuje polecenia .vimrcw bieżącym katalogu.

Inną rzeczą, na którą warto zwrócić uwagę, jest skonfigurowanie sesji ( :h session) ze standardowym widokiem i ustawieniami projektu.

Wszystko to powiedziawszy, prawdopodobnie wybrałbym opcję wtyczki opisaną przez Luca Hermitte'a.

poważny
źródło
6
Zobacz komentarz fen. Może to mieć poważne konsekwencje dla bezpieczeństwa.
dane z
11

Aby zminimalizować zagrożenia bezpieczeństwa z DOWOLNYMI funkcjami „automatycznego uruchamiania” CZEGOKOLWIEK w dzisiejszych czasach, czy mogę doradzić Ci wykorzystanie istniejących funkcji vima zamiast wtyczek (bagaż przenośności)?

Na przykład.

Plik vimrc mojego folderu lokalnego nosi nazwę „_gvimrc” (celowo). Zmniejsza to nadzieję, że ludzie tacy jak Fen nie będą się bawić naszym kosztem. :-)

W moim pliku $ VIM / .vimrc wstawiłem:

if filereadable("_gvimrc")
    source _gvimrc
endif

na końcu.

Używam "filereadable ()" zamiast "fileexists ()", ponieważ później ma pewne dziwactwa, gdy torturuje się otwieraniem wielu (10+) plików jednocześnie (nie wiem dlaczego).

Oczywiście możesz nadać własną unikalną nazwę pliku, aby jeszcze bardziej zaciemnić potencjalnego sprawcę problemów. Takich jak "_mygvimrc", "_gobbledygook", itd. Musisz tylko wybrać jedną znormalizowaną nazwę i odpowiednio ją umieścić w swoim $ VIM / .vimrc. Poleganie na wewnętrznych rozwiązaniach vi / vim wyklucza problemy z przenośnością. ALE, NIE NAZYWAJ go .vimrc (lub _vimrc), aby zapobiec rekursywnemu źródłu w przypadku późniejszej edycji pliku $ VIM / .vimrc w vimie.

Używam tego od Windoze 98SE, poprzez Windork XP Pro, a teraz Windorkier 7 (już ponad 5 lat). Zaznaczę listę plików .txt w Eksploratorze, a następnie użyję „Edytuj z wieloma Vimami”, co spowoduje jednoczesne otwarcie wielu okien Vima. W swojej pracy robię to kilka razy dziennie, codziennie. Wszystkie pliki zostały potraktowane z tym, co ustawiłem w moim lokalnym _gvimrc.

XEQtor
źródło
Tutaj nieufność do przenośności wtyczek nie ma podstaw, ponieważ te wtyczki local_vimrc (przynajmniej moje) są przenośne (kiedyś były utrzymywane w różnych systemach operacyjnych, a nawet w Windows 95). Kwestia zagrożenia bezpieczeństwa jest również przesadzona: jeśli będziemy postępować w ten sposób, nigdy nie zainstalujemy niczego, co ułatwiłoby nam pracę.
Luc Hermitte
Ale jeśli o mnie chodzi, pierwszym prawdziwym problemem jest to, że przy twoim podejściu musisz pracować z dokładnym katalogiem zawierającym plik _gvimrc (co jest złą nazwą, ponieważ ma zawierać rzeczy specyficzne dla gvim). Jeśli Twój projekt składa się z kilku katalogów, które mogą wymagać wspólnej konfiguracji i konkretnych (w przypadku wielu modułów), szybko pokaże to jego ograniczenia.
Luc Hermitte
Drugą kwestią jest to, że możesz pracować tylko nad jednym projektem na raz - jeśli chcę pracować na OTB, openjpeg i projekcie, który integruje obie biblioteki, to rozwiązanie nie pozwoli mi mieć określonego ustawienia dla każdej z trzy projekty.
Luc Hermitte
Działa to również w przypadku łańcuchowego ładowania pliku składni z katalogu lokalnego.
maharvey67
2

Zakładając, że ludzie nie dodają plików co kilka dni, prawdopodobnie możesz dodać modelinę na początku każdego pliku. W rzeczywistości, jeśli twój system kontroli wersji na to pozwala, prawdopodobnie możesz wymusić regułę, która mówi, że każdy plik musi mieć modeline, kiedy jest wpisywany.

Nathan Fellman
źródło
2

Użyj „editorconfig”

Jeśli rodzaje standardów kodowania, które chcesz wymusić, są związane ze stylem wcięcia, rozmiarem tabulatora, formatem pliku i zestawem znaków, możesz zajrzeć do „editorconfig” , który jest standardem między edytorami, aby określić tego rodzaju ustawienia w konkretny projekt i wszyscy redaktorzy powinni przestrzegać tej konfiguracji.

Specyfikacja „editorconfig” umożliwia projektom żądanie różnych ustawień w zależności od rozszerzeń plików lub nazw w projekcie. (Możesz więc mieć pliki Makefile używające TAB, skrypty Pythona używające 4 spacji, a skrypty powłoki używające 2 spacji do wcięć).

Potrzebujesz wtyczki do używania "editorconfig" w Vimie. Oficjalna strona udostępnia jeden, ale osobiście polecam sgur / vim-editorconfig , który jest napisany w czystym Vimscript, więc nie musisz się zbytnio martwić o zewnętrzne zależności.

Ponieważ „editorconfig” ma na celu kompatybilność z wieloma edytorami, jest dość ograniczony w tym, co robi, więc jeśli chcesz mieć spójne białe znaki, format pliku (DOS vs. Unix) i kodowanie (Unicode utf-8, itp.), Wtedy „editorconfig " jest dla Ciebie.

filbranden
źródło
0

Spojrzałem na istniejące wtyczki i nie podobały mi się żadne z nich, więc napisałem prostą funkcję, która działa na vim-fugitive . Zaletą tego jest to, że wie, że korzeniem projektu jest zawsze katalog główny repozytorium, a dodatkowo mogę haszować plik, aby zachować tabelę zaufania. Po prostu umieść następujące informacje w swoim .vimrcpliku.

function LoadRepoVimrc()
  let l:path = fugitive#repo().tree('.vimrc')
  if filereadable(l:path)
    let l:sha1 = fugitive#repo().git_chomp('hash-object',l:path)
    if !exists('g:SAFE_VIMRC') | let g:SAFE_VIMRC = {} | endif
    if has_key(g:SAFE_VIMRC,l:path) && g:SAFE_VIMRC[l:path] ==? l:sha1
      execute 'source '.fnameescape(l:path)
    elseif confirm("Trust ".l:path."?", "&Yes\n&No",2) == 1
      let g:SAFE_VIMRC[l:path] = l:sha1
      execute 'source '.fnameescape(l:path)
    else
      execute 'sandbox source '.fnameescape(l:path)
    endif
  endif
endfunction
autocmd User FugitiveBoot call LoadRepoVimrc()
set viminfo ^= !

Jeśli !opcja jest ustawiona w viminfoustawieniu, SAFE_VIMRCsłownik zostanie zachowany między uruchomieniami (zwróć uwagę, ^aby dołączyć opcję przed nią, aby nie zepsuła nopcji).

Parakleta
źródło