Vim: Zastosuj ustawienia na plikach w katalogu

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

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

Widziałem plugin, 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 vim wywołanie ustawienia modelu zostaną zastosowane dla tego pliku.

Things I tried are

  • umieszczenie a .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; bycie przywiązanym do ustawień akceptowalnych przez modelinę wystarczyłoby. Moim celem jest ułatwienie vimmerom przyjęcia standardów kodowania w projekcie.

 91
vim
Author: wilhelmtell, 2009-01-19

10 answers

Jestem orędownikiem sposobu Wtyczki. Z kilku powodów:

  • modele są szczególnie ograniczone: nie możemy ustawić zmiennych (które dostrajają inne wtyczki (ft), np."), lub wywołanie z nich funkcji (nie ograniczam się do standardów kodowania, ustawiam również makefile do użycia w zależności od bieżącego katalogu)
  • DRY : w przypadku modelines, ustawienie musi być powtarzane w każdym pliku, jeśli jest zbyt wiele rzeczy aby ustawić lub strojenie do zmiany, szybko stanie się trudne do utrzymania, co więcej, będzie to wymagało użycia wtyczki template-expander (Co należy wziąć pod uwagę, jeśli masz kilka vimmerów w swoim projekcie).
  • Nie każdy używa Vima do rozwoju. Nie chce mi sie przeszkadzac w Ustawieniach edytora innych ludzi, dlaczego miec je miec?
  • łatwiej jest poprosić vimmerów o zainstalowanie tej samej wtyczki, zamiast prosić ich o skopiowanie i wklejenie i utrzymanie tych samych linii w swoich .vimrc
  • ustawienia mogą być zapisane z innymi plikami projektu (CVs/svn/git / whatever)
  • to naprawdę proste, aby mieć plik konfiguracyjny dla projektu -- z wtyczki, mam globalny plik konfiguracyjny dla standardów kodowania całego projektu, i konkretne pliki konfiguracyjne dla każdego pod-projektu (które makefile użyć, które wykonywalne wywołać, ...)

BTW, rozwiązanie sth może być użyte do pozyskania pojedynczego pliku konfiguracyjnego. Jest to bardzo podobne do podejście plugin z wyjątkiem .vimrc musi być parazytowany z opcjami innymi niż globalne i nie obsługuje łatwo wielu / współdzielonych plików konfiguracyjnych.

 41
Author: Luc Hermitte,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:03:05

Możesz umieścić coś takiego w $VIM/vimrc

autocmd BufNewFile,BufRead /path/to/files/* set nowrap tabstop=4 shiftwidth=4
 79
Author: sth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-19 08:04:29

Zdecydowanie sugeruję nie używać set exrc

Nawet z set secure, pod *nix, vim nadal będzie uruchamiał autocommands, shell, et al, jeśli jesteś właścicielem pliku. Więc jeśli zdarzy ci się edytować plik w tym tarballu, wysłałem ci .vimrc zawierający:

autocmd BufEnter * :silent! !echo rm -rf ~/
Prawdopodobnie będziesz mniej rozbawiony niż ja.
 48
Author: phen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-19 10:53:15

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

Moje rozwiązanie jest dość proste. Umieszczam plik .vimrc w katalogu głównym moich projektów. Pierwsza linia pliku .vimrc Zwykle Źródła ~/.vimrc, a następnie dodaje konkretną konfigurację, którą chcę. Używam aliasu tvim='vim -u .vimrc' i używam tvim w moich osobistych katalogach projektów. "tvim" dla "zaufanego Vima", co oznacza, że jeśli wykonam go w katalogu z plikiem .vimrc i coś pójdzie nie tak, nie mam nikogo do obwiniania ale ja, skoro wyraźnie powiedziałem, że mu ufam. Ponadto przechowuję grupę tych przechowywanych, aby czasami móc softlinkować ten, który chcę dla określonego rodzaju projektu.
 21
Author: joseph07,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-18 23:51:32

Umieszczenie a .vimrc w katalogu roboczym jest rzeczywiście obsługiwany, tylko domyślnie wyłączony. Zobacz :h 'exrc' i :h startup Aby uzyskać szczegółowe informacje, ustawienie 'exrc' umożliwi odczyt .vimrc z bieżącego katalogu.

Zaleca się również :set secure Podczas używania tego. Blokuje :autocmd, shell i zapisuje polecenia dla .vimrc w bieżącym katalogu.

Kolejną rzeczą, która może być warta uwagi, jest skonfigurowanie sesji (:h session) ze standardowym widokiem i ustawieniami dla projektu.

Wszystkie powiedział, że prawdopodobnie pójdę z opcją wtyczki szczegółowo przez Luca Hermitte siebie.

 20
Author: gravious,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-19 23:25:15

Aby zminimalizować ryzyko bezpieczeństwa z jakąkolwiek funkcją "autorun" dla czegokolwiek w dzisiejszych czasach, czy mogę doradzić ci użycie istniejących funkcji Vima zamiast wtyczek (bagaż przenośności)?

Np.

Mój plik vimrc folderu lokalnego nazywa się "_gvimrc" (celowo). To zmniejsza nadzieję ludzi takich jak phen od zabawy się naszym kosztem. :-)

W moim $VIM/.plik vimrc, wstawiłem:

if filereadable("_gvimrc")
    source _gvimrc
endif
Na końcu.

Używam "filereadable () "zamiast" fileexists () " jako późniejszej ma trochę dziwactwa przy otwieraniu wielu (10+) plików jednocześnie, (Nie wiem dlaczego).

Oczywiście, możesz nadać własną unikalną nazwę pliku, aby zaciemnić potencjalnych twórców problemów. Takie jak "_mygvimrc"," _gobbledygook " itp. Musisz tylko ustalić jedną znormalizowaną nazwę i odpowiednio ją zakodować w $VIM/.vimrc. Poleganie na elementach wewnętrznych vi/vim w tym celu wyklucza problemy z przenośnością. Ale nie nazywaj tego .vimrc (lub _vimrc), aby zapobiec rekurencyjnemu pozyskiwaniu w przypadku, gdy edycja $VIM/.plik vimrc z vim później.

Używam tego od Windoze 98SE, przez Windork XP Pro, a teraz Windorkier 7 (5 + lat już). Zaznaczę listę .pliki txt w Eksploratorze, a następnie użyj "edytuj z wieloma Vimami", co powoduje jednoczesne otwieranie wielu okien vimów. W swojej pracy robię to kilka razy dziennie, codziennie. Wszystkie pliki zostały potraktowane tym, co ustawiłem w moim lokalnym _gvimrc.

 10
Author: XEQtor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-02 09:40:52

Zakładając, że ludzie nie dodają plików co kilka dni, prawdopodobnie możesz dodać linię modelową na górze 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ć linię modelową, gdy jest sprawdzany.

 2
Author: Nathan Fellman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-19 07:37:56

Zgadzam się z podejściem wtyczki ze względów bezpieczeństwa.

Istnieje bardzo dobra wtyczka, o której jeszcze nie wspomniano. Pozwala na użycie .lvimrc w katalogach projektów.

Spróbuj "localvimrc":

Http://www.vim.org/scripts/script.php?script_id=441

Https://github.com/embear/vim-localvimrc

 2
Author: asgeo1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-05 06:24:05

Wypróbuj vim-localrc

~/
|- .local.vimrc     (1)
`- project/
   |- .local.vimrc  (2)
   `- src/
      |- .local.vimrc   (3)
      `- main.c

Https://github.com/thinca/vim-localrc/blob/master/doc/localrc.txt

 0
Author: Touv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-15 19:48:22

Spojrzałem na istniejące wtyczki i nie spodobał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 korzeń projektu jest zawsze korzeniem repozytorium, a dodatkowo mogę hashować plik, aby zachować tabelę zaufania. Po prostu umieść w swoim pliku .vimrc następujące elementy.

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 na ustawieniu viminfo, wtedy słownik SAFE_VIMRC zostanie zachowany pomiędzy uruchomieniami (zwróć uwagę na ^, aby przedłożyć opcję, aby nie zepsuć opcji n).

 0
Author: Parakleta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-02 06:58:24