Bir komutla veya yerel vimrc dosyalarıyla birden çok vim yapılandırması arasında nasıl geçiş yapılır?


85

C de her biri kendi sekme / girinti / boşluk standartları olan birkaç grupta çalışıyorum.

Her biri için ayrı seçilebilir VIM yapılandırmalarına sahip olmanın bir yolu var mı, bu nedenle bir dosyayı düzenlediğimde:

  • set group=1Bir konfigürasyon seçmek gibi bir şey yapıyorum
  • yapılandırmayı otomatik olarak ayarlamak için çalışma dizininde yaşayan yerel bir .vimrc kullanılır


Süper kullanıcı üzerinde iki farklı vim yapılandırması arasında geçiş yapma sorusuna da bakın .
Hotschke

Yanıtlar:


40

Özetle

Bunu yapmanın birkaç yolu var, bunlardan çoğu önerildi, ancak bunları fazladan iki tane ile özetleyeceğimi düşündüm:

  • Dizin başına vimrc - Vim'in doğru dizinde başlatılması dezavantajına sahiptir: projeniz içerisindeyse ~/project1ve varsa ~/project1/.vim.customve yapıyorsanız cd ~ ; vim project1/file.c, özel ayarlar bulunmayacaktır.
  • Modelinler - çok etkilidir, ancak bunları tüm dosyalara eklemeye ihtiyaç duyma dezavantajına sahiptir (ve bunları yeni dosyalara eklemeyi unutmayın)
  • Dizine özel otomatik komutlar - bu çok etkilidir
  • Dosyadaki belirli bir başlığı tarayın (aşağıya bakın) - bu, geçmişte farklı şirketler için veya açıkça adlandırılmış projeler üzerinde çalışırken en çok kullandığım başlıktır.
  • Dosya açıldığında kontrol edilen dizin başına vimrc (aşağıya bakın). Özellikle proje kodunuzun hepsi tek bir yerdeyse, uygulanması oldukça kolay olan başka bir yöntem.

Bir Başlık Taranıyor

Birçok kuruluşta, her kaynak dosyanın en üstünde standart bir başlık (telif hakkı bildirimi ve proje adı vb. İle birlikte) bulunur. Bu durumda, Vim'in bir anahtar sözcük arayan dosyanın ilk (örneğin) 10 satırını otomatik olarak taramasını sağlayabilirsiniz. Bulursa, ayarlarınızı değiştirebilir. Bunu kullandığım formdan daha basit hale getirmek için değiştirdim (ki bu pek çok başka şey yapar), ancak ~/.vim/after/filetype.vim(henüz bir tane yoksa) oluşturun ve buna benzer bir şey ekleyin:

au FileType * call <SID>ConfigureFiletypes(expand("<amatch>"))

" List of file types to customise
let s:GROUPNAMETypes = ['c', 'cpp', 'vhdl', 'c.doxygen']

func! <SID>CheckForGROUPNAMECode()
    " Check if any of the first ten lines contain "GROUPNAME".

    " Read the first ten lines into a variable
    let header = getline(1)
    for i in range(2, 10)
        let header = header . getline(i)
    endfor

    if header =~ '\<GROUPNAME\>'
        " Change the status line to make it clear which
        " group we're using
        setlocal statusline=%<%f\ (GROUPNAME)\ %h%m%r%=%-14.(%l,%c%V%)\ %P
        " Do other customisation here
        setlocal et
        " etc
    endif
endfunc

func! <SID>ConfigureFiletypes(filetype)
    if index(s:GROUPNAMETypes, a:filetype) != -1
        call <SID>CheckForGROUPNAMECode()
    endif
endfunc

Herhangi bir türden bir dosya açıldığında ve dosya türü ayarlandığında ( au FileType *satır), ConfigureFiletypesişlev çağrılır. Bu, dosya türünün mevcut grupla (GRUPNAME) ilişkili dosya türleri listesinde olup olmadığını kontrol eder, bu durumda 'c', 'cpp', 'vhdl' veya 'c.doxygen'. Eğer öyleyse, dosyanın ilk 10 satırını okuyan ve GROUPNAME içeriyorsa bazı özelleştirme yapan CheckForGROUPNAMECode () 'u çağırır. Genişletme sekmeleri veya her neyse, bu aynı zamanda durum çubuğunu da grup adını açıkça gösterecek şekilde değiştirir, böylece bir bakışta çalıştığını bilirsiniz.

Açarken Yapılandırmayı Kontrol Etme

JS Bangs'in önerisine çok benzer şekilde, özel bir yapılandırma dosyasına sahip olmak faydalı olabilir. Ancak, onu vimrc'ye yüklemek yerine, bunun gibi bir şey düşünün; bu, .c dosyasıyla aynı dizindeki .vim.custom için bir .c dosyası açıldığında kontrol edecektir.

au BufNewFile,BufRead *.c call CheckForCustomConfiguration()

function! CheckForCustomConfiguration()
    " Check for .vim.custom in the directory containing the newly opened file
    let custom_config_file = expand('%:p:h') . '/.vim.custom'
    if filereadable(custom_config_file)
        exe 'source' custom_config_file
    endif
endfunction

66

Bunun içinde var $HOME/.vimrc:

if filereadable(".vim.custom")
    so .vim.custom
endif

Bu, .vim.customo dizine özel komutları ve seçenekleri yüklemek için her dizine bir dosya koymama izin veriyor . Derin dizin yapılarına sahip birden fazla proje üzerinde çalışıyorsanız, daha karmaşık bir şeye ihtiyacınız olabilir (örneğin .vim.custom, bir bulunana kadar dizin ağacında yukarı doğru yürüyün ), ancak aynı temel fikir işe yarayacaktır.

GÜNCELLEME:

Şu .vimanki dizinin ne olduğuna bakılmaksızın, düzenlediğim dosyayla aynı dizinden bir dosyayı okumak için şimdi buna benzer bir şey yapıyorum .

let b:thisdir=expand("%:p:h")
let b:vim=b:thisdir."/.vim"
if (filereadable(b:vim))
    execute "source ".b:vim
endif

1
Bu harika, bunu hiç görmedim!
Jim Mitchener

1
Bu, depolarda yaşayan projeler için harika bir çözüm!
bradreaves

3
'exrc'Seçenek zaten bu çok benzer bir şey yapıyor sağlar. Geçerli çalışma dizinine .vimrc/ .exrc/ yükleyecektir .gvimrc.
jamessan

Hakkındaki yorum exrcdoğru cevap olmalıdır. Geriye kalan her şey karmaşık ve karmaşık görünüyor.
silvenon

Kullanmak exrcgüzel, ancak düzenlediğim dosyayla aynı çalışma dizininde olmasam bile doğru dosyayı aldığım için minnettarım.
JSB ձոգչ

34

Ayrıca koyabilirsiniz autocommands sizin de .vimrcbaşına yola temelinde hangi set belirli seçenekleri.

au BufRead,BufNewFile /path/to/project1/* setl sw=4 et
au BufRead,BufNewFile /path/to/project2/* setl sw=3 noet

Bu, depoyu kontrol etmediğinizde harikadır, böylece ".vim.custom" dosyalarını oraya koyamazsınız. Depoyu temiz tutmasını seviyorum. Teşekkürler. Sorumluluk reddi: Yol kalıplara uygun olmayan bir şekilde değişmeye devam ederse, ".vim.custom" sürümü depoyu değiştirebileceğini varsayarsak muhtemelen daha güzeldir.
lpapp

17

Doğru şeyi yapan eklenti: http://www.vim.org/scripts/script.php?script_id=441

“Bu eklenti, şu anda açık olan dosyanın dosya sistemi ağacında yerel vimrc dosyalarını arar. Varsayılan olarak, dosyanın dizininden kök dizine kadar tüm ".lvimrc" dosyalarını arar ve bunları ters sırada yükler. Dosya adı ve yüklenen dosyaların miktarı genel değişkenler aracılığıyla özelleştirilebilir. "


3
Github

Bir başka benzer eklenti localrc.vim'dir; ayrıca dosya türüne özgü her dizin ayarına da izin verir; Bunu vazgeçilmez buluyorum. vim.org/scripts/script.php?script_id=3393
Ingo Karkat

12

Diğer geliştiricilerinizin bundan şikayet etmeyeceğini varsayarsak, yorumlardaki her dosyaya her zaman vim ayarları ekleyebilirsiniz.

/*
 * vim:ts=4:sw=4:expandtab:...
 */

int main(int argc, char **argv)
{
    ...

2
Takımlarımın çoğunda aydınlanmış tek ahem geliştiriciyim , bu yüzden kimse aldırmasın. Bu, dosya başına gerçekten düzgün bir çözümdür.
bradreaves

1
Göze batmamak için onları en alta eklemeyi tercih ederim, ama sanırım bu bir stil meselesi.
nyuszika7h

5

Tam da bu amaç için açık kaynaklı bir araç yarattım. Başlıkları, taramayı, yapılandırmaları ve yerel vimrc dosyalarını unutun.

Yüzmeyi dene.


Yüzmek

swimvimrc dosyalarını değiştirmek ve uygun takma adlar oluşturmak için hızlı bir araçtır. İşte kısa bir kullanım listesi. Açıklamalı bir gif ve indirme talimatları için Github deposuna bakın :


Kullanım

swim add ~/dotfiles/myVimrc favorite    #Add new swim alias
swim ls                                 #Show available swim aliases
swim add https://raw.githubusercontent.com/dawsonbotsford/swim/master/exampleVimrcs/vimrcWikia.vim example
swim with favorite         #Set alias favorite as primary .vimrc
swim with main             #Set alias main as primary .vimrc

Daha fazla oku

https://github.com/dawsonbotsford/swim


4

Önceki göndericinin önerdiği localvimrc eklentisini denedikten sonra, vim ayarları üzerinde proje başına nafile olmayan kontrole sahip olmayı çok seviyorum.

Varsayılan olarak bir .lvimrc dosyasını yüklemeden önce onay ister, ancak .lvimrc dosyalarını otomatik olarak yüklemek için bir ayar vardır. Bazıları bunu bir güvenlik açığı olarak görebilir, ancak reklamı yapıldığı gibi çalışır.

.Lvimrc dosyalarını .gitignore etmeyi seçtim. Alternatif olarak, bunları bir paylaşılan ayarlar biçiminde kontrol edebilirsiniz (sekme / alan genişletme, sekme durakları, diğer projeye özgü ayarlar).


1
Bu komut dosyası harika: github.com/MarcWeber/vim-addon-local-vimrc . 1) Artık yalnızca bir kez sorar ve dosya karmasını Tamam olarak işaretler. 2) Dizin ağacını kökten geçerli dizine çevirir, daha yakın yüksek öncelikli dosyaları en son alır.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

.lvimrcDosyayı neden eklemelisiniz .gitignore? Mesele şu ki, vim kullanan ve eklentiyi kuran herkes aynı ayarları alıyor.
nyuszika7h

2
@ nyuszika7h bazı ayarların uygulanması gerekirken diğerleri tamamen kişiseldir. Herkes için zorunlu kılınması
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1

Sledge tarafından belirtildiği gibi , bu eklentinin kullanımı gördüğüm ve kullandığım en iyi seçenektir. Jerseyboy, önerilen yardımcı programın yüklemeden önce (yani her dosyayı açtıktan sonra) onay istediği yorumunu yaptı. Bundan kaçınmak için ana .vimrcyerel .lvimrcdosyalar listesini ayarlamanız yeterlidir:

let g:localvimrc_whitelist='/development/kernel/.lvimrc'


1

İşte jamessan'ın bir varyasyonu

function! ConditionalLoad()
    let cwd = getcwd()
    if getcwd() =~ $HOME . "/src/mobile"
        so $HOME/.vim.mobile
    endif
endfunction
autocmd VimEnter * call ConditionalLoad()

Vi'yi sık sık, atladığım belirli bir dosya olmadan başlatacağım, böylece bu, mevcut çalışma dizinine bağlı olarak yapılandırmanın koşullu olarak yüklenmesini sağlar. Dezavantajı, yapılandırmanın dosyaya dayalı olarak değil, çalışma dizini dışında uygulanmasıdır.


Tam olarak aradığım şey. Kullanım Örnek olarak: Bu kod yerleştirilir ~/.vimrcdeğişti, /src/mobilebenim Symfony'nin projeleri dizinine (benim durumumda oldu /www/symfony) ve modifiye .vim.mobileetmek .vim.symfony, sonra yerleştirilen yeni .vimrc yapılandırma içine ~/.vim.symfonydosyası
jmarceli

1

C de her biri kendi sekme / girinti / boşluk standartları olan birkaç grupta çalışıyorum.

Aynı anda her tür açık kaynakla çalışıyorum. Ayrı .vimrcdosyalar oluşturmak ve biçimlendirme standartlarını yeniden yapılandırmak pratik değildir . On yıldan daha uzun bir süre önce, editör yapılandırmasıyla uğraşmaktan bıktım ve autotabonu idare etmek için çağrılan bir program yazdım .

autotabVim önerilen ile kurulduğunda , Vim'e her dosya yüklediğinizde, dosya autotabüzerinde çağrılır ve Vim ayarları çıktısı autotabbir :setkomuta aktarılır .

autotabDosyadan birkaç bin satırları okur bunları analiz eder ve ayarlarını belirler expandtab, tabstopve shiftwidthparametreler.

Dosyanın sert sekmeler mi yoksa sadece girinti için boşluk mu kullandığını anlar ve girinti boyutunu belirler. Dosya sekmelerle girintilendirilmişse, çeşitli sekme boyutları kullanarak dosya örneğini oluşturmaya ve dahili öğelerin satır üzeri satır hizalaması gibi sezgisel yöntemlere göre değerlendirmeye dayalı olarak doğru sekme boyutunu belirler.

Yıllar önce algoritmayı değiştirmeyi bıraktığım için yeterince iyi çalışıyor. Kafası karışırsa, bunun nedeni neredeyse her zaman dosyanın aynı anda birden çok kuralın kullanılması gibi biçimlendirme sorunları olmasıdır.

Aynı zamanda dosya türünün "agnostikidir" ve çeşitli farklı dillerde iyi çalışır. Ben sadece C üzerinde değil, kabuk betikleri, Lisp, Makefiles, HTML ve sizde ne varsa kullanıyorum.

Projeye özgü olabilecek diğer biçimlendirme parametrelerini, örneğin C dosyalarında, bir ifadedeki caseetiketlerin switchgirintili olup olmadığı veya sarmalanmış işlev bağımsız değişken listelerinin basitçe girintili olup olmadığı veya bağımsız değişken listesinin parantez açma. Vim'in bu tür şeyler için ayarları vardır ve bu nedenle program, stili analiz etmek ve bu parametreleri çıkarmak için makul bir şekilde genişletilebilir.


0

Çoğunlukla aynı sorunu arıyordum, Sauce eklentisini de buldum: http://www.vim.org/scripts/script.php?script_id=3992

İddia ediyor:

Sauce, farklı ortamlar için farklı ayarları yüklemek için kullanılabilen birden fazla vimrc dosyası için hafif bir yöneticidir. Kısacası, çok sayıda farklı vim ayar dosyası tutabilir ve yalnızca ihtiyaç duyduğunuzda ihtiyaç duyduğunuz dosyaları yükleyebilirsiniz.

Kullanıcının dosya sistemi boyunca dotfiles serpiştirmesini beklemek yerine, yapılandırmasını tüm veri dizininde tutmasını özellikle ilginç buluyorum. Bu, çoğu zaman kişisel zevklerin bir ölçüsü olsa da.

Yine de henüz test etmedim.


0

Sen kullanabilirsiniz istifleme yapılandırma geçiş için (herhangi bir dotfiles, sadece .vimrc)

Kurulum stow:

$ apt install stow

Her konfigürasyon için birden fazla dizin oluşturun:

~$ ls -d ~/dotfiles/vim*
vim-all vim-webdev vim-go

İçlerine farklı .vimrc'ler koyun :

$ find ~/dotfiles -name .vimrc
/home/username/vim-golang/.vimrc
/home/username/vim-webdev/.vimrc
/home/username/vim-all/.vimrc

Şimdi bu komutla vim-golang yapılandırmasını başlatabilirsiniz (dotfiles dizininde çalıştırılmalıdır):

~$ cd ~/dotfiles

dotfiles$ stow -v vim-golang
LINK: .vimrc => dotfiles/vim-golang/.vimrc

Şimdi bağlantılı:

$ cd ~ && ls -l .vimrc 
.vimrc -> dotfiles/vim-golang/.vimrc

Yapılandırmayı değiştirmeniz gerekirse, stowşunu unutmayın:

~$ cd dotfiles

dotfiles$ stow -v -D vim-golang
UNLINK: .vimrc

dotfiles$ stow -v vim-webdev
LINK: .vimrc => dotfiles/vim-webdev/.vimrc

$ cd ~ && ls -l .vimrc 
.vimrc -> dotfiles/vim-webdev/.vimrc

Burada daha fazla bilgi edinin : GNU stow ile nokta dosyalarını yönetme

Artıları : oldukça basit, hiçbir vim eklentisi bağımlılığı yok, sadece tüm dot dosyalarını yönetmek için kullanılamaz .vimrc.

Eksileri : yapılandırmalar birbirinden bağımsızdır, her birini ayrı ayrı yönetmeniz / güncellemeniz gerekir (yapılandırmalarınızı çok sık değiştirmez / güncellemezseniz - sorun bu olmayacaktır).

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.