Vim: ayarları dizindeki dosyalara uygulayın


103

Geçerli dizindeki tüm dosyalar için Vim ayarlarını nasıl belirleyebilirim?

İdeal çözüm, Vim'in ~ / .vimrc'yi aramadan önce mevcut dizinde bir .vimrc araması ve okuması ve oradaki ayarları tüm ağaç için uygulamasıdır.

Bir eklenti gördüm , ancak bu, eklentinin yüklenmesini gerektirdiği için uygulanan ayarların şeffaf olmadığı anlamına geliyor. Bunun aksine, bir modelin şeffaftır, çünkü bir kullanıcının vimrc veya belirli vim çağrısına bakılmaksızın modelin ayarları o dosya için uygulanacaktır.

Denediğim şeyler

  • çalışma dizinine bir .vimrc yerleştirmek
  • :so vimrc modelinde.

Sanırım ikisi de güvenlik nedeniyle çalışmıyor. Bir vimrc'nin tam gücüne ihtiyacım yok; bir modelin tarafından kabul edilebilir ayarlara bağlı olmak yeterli olacaktır. Amacım, vimmers'ın bir projede kodlama standartlarını benimsemesini kolaylaştırmak.


Yanıtlar:


42

Eklenti yolunun bir savunucusuyum . Birkaç nedenden dolayı:

  • Modelinler özellikle sınırlıdır: değişkenler ayarlayamayız (bu, diğer eklentileri ayarlayamaz, örneğin "ön-snippet'in parantezleri yeni satırda mı olmalı?") Veya onlardan işlevi çağıramayız (kendimi sınırlamıyorum kodlama standartlarına göre, ayrıca makefile'ı mevcut dizine bağlı olarak kullanacağım)
  • DRY : modelinlerde, bir ayarın her dosyada tekrarlanması gerekir, ayarlanacak çok fazla şey veya değiştirilecek ayarlar varsa, bakımı çabucak zorlaşır, dahası, bir şablon genişletici eklentisinin kullanılmasını gerektirir ( projenizde birkaç vimmeriniz varsa dikkate almanız gerekir).
  • Herkes geliştirmek için vim'i kullanmaz. Başkalarının editör ayarlarından rahatsız olmak istemiyorum, neden onlarınkini parazite edeyim?
  • Vimmers'dan aynı satırları kopyalayıp yapıştırmalarını ve .vimrc dosyalarının bakımını yapmalarını istemek yerine, vimmers'dan aynı eklentiyi yüklemelerini istemek daha kolaydır.
  • Ayarlar diğer proje dosyalarıyla (cvs / svn / git / ne olursa olsun) kaydedilebilir.
  • Proje başına bir konfigürasyon dosyasına sahip olmak gerçekten çok kolay - eklenti ile, genel projenin kodlama standartları için global bir konfigürasyon dosyam ve her bir alt proje için özel konfigürasyon dosyam var (kullanılacak makefile, hangi yürütülebilir çağırmak için , ...)

BTW, sth'nin çözümü tek bir konfigürasyon dosyasını kaynaklamak için kullanılabilir. .Vimrc'nin global olmayan seçeneklerle parazitlenmesi gerekmesi dışında bu eklenti yaklaşımına çok benzer ve kolayca çoklu / paylaşılan yapılandırma dosyalarını desteklemez.


Eklentiyi doğru bir şekilde çalıştırmadan önce yola yeni bir dosya kaydetmeniz gerektiğini fark ettim
cmcginty

Aslında. Bu eklenti ailesi sadece bir çerçeve tanımlar. Yine de projeye özgü tanımları çerçevenin otomatik olarak kaynaklayacağı bir dosyaya yazmanız gerekir.
Luc Hermitte

1
Luc'un kendi eklentisini bağladığını lütfen unutmayın. Bu, soruyla bağlantılı olandan çok daha iyi çalışıyor gibi görünüyor. Teşekkürler.
Veri

İyi. Söyleyemem Benimkini yıllardır kullandığım için diğer uygulamalara hiç yakından bakmadım. Zaman zaman, sonunda hesaba kattığım bir hata raporu alıyorum. BTW, benim sürümüm, şablonları genişletmeden önce projeye özgü değişkenleri ayarlamak için mu-şablonundan önce tetiklenecek şekilde uygulandı (bu, mevcut proje kök dizinini almak ve genişletilen yol
adlarından

1
@JasonMcCarrell local_vimrc ve Markus "embear" uygulamam Braun'un kara liste, beyaz liste desteği var ... Girintinin nasıl yapıldığını belirtmeniz gerekiyorsa, EditorConfig-vim eklentisi daha iyi bir seçim olabilir.
Luc Hermitte

91

Bunun gibi bir şey koyabilirsin $VIM/vimrc

autocmd BufNewFile,BufRead /path/to/files/* set nowrap tabstop=4 shiftwidth=4

1
Bu özyinelemelidir, ancak yalnızca *. Dosyayı / yol / dosyaya / veya / yol / dizinine / dosyalara indirgemeye çalışırsanız çalışmaz.
SystemParadox

Projenizde "noexpandtab" ile yazılmış bir dosya ağacı ve tüm dosyaları "expandtab" (ör. CodeIgniter) içeren başka bir ağaç varsa bu harika. Her ağaçtaki dosyalar için uygun eylemi bir yapılandırma dosyasıyla ayrı ayrı ayarlayabilirsiniz.
user9645

2
İşin garibi, yolum bir sembolik bağlantı içerdiğinde bu işe yaramadı; Çalışmadan önce sembolik bağlar olmadan tam yolu koymak zorunda kaldım.
Dolan Antenucci

Alternatif olarak "güvenilir bir vim" kullanma hakkındaki joseph07'nin yanıtına bakın, bu yaklaşımın tersine çevrilmesi (dağıtılmış .vimrc'ye karşı merkezi).
Nathan Schulte

50

Kesinlikle kullanmamayı öneririm set exrc

set secure* Nix altında bile , dosyanın sahibiyseniz, vim autocommand, shell, vb. Çalıştırmaya devam edecektir. Dolayısıyla, bu tarball'daki bir dosyayı düzenlerseniz, size şunu içeren bir gönderdim .vimrc:

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

Muhtemelen benden daha az eğleneceksin.


6
Bu, vim yüklendiğinde otomatik olarak çalıştırılan eklentiler için de geçerlidir.
Luc Hermitte

31

Bu soru eskidir, ancak oldukça doğal ve kalıcı bir endişe gibi görünüyor.

Çözümüm oldukça basit. .vimrcProjelerimin kök dizinine bir dosya yerleştiriyorum . .vimrcDosyanın ilk satırı genellikle kaynaklar ~/.vimrcve ardından istediğim belirli yapılandırmayı ekler. Ben takma tvim='vim -u .vimrc've kullanım tvimbenim kişisel proje dizinleri. "güvenilir vim" için "tvim", yani onu bir .vimrcdosyayla bir dizinde çalıştırırsam ve bir şeyler ters giderse, ona güvendiğimi açıkça söylediğim için kendimden başka suçlayacak kimsem yok demektir. Ayrıca, bunların bir grubunu sakladım, böylece bazen belirli bir proje türü için istediğimi softlink edebiliyorum.


1
Bu yaklaşım basittir ve ihtiyaçlarımı mükemmel şekilde karşılar.
Jinxed

Bunu denediğimde ve source $HOME/.vimrcyerelden .vimrc, Vim sistem genelinde kurulu eklentilerimi bulamadığından şikayet ediyor (bu durumda patojen; execute pathogen#infect()üstümdeki komut $HOME/.vimrcbaşarısız oluyor Unknown function ...). Bunu nasıl düzeltebilirim?
Nathan Schulte

20

Bir .vimrc dosyasının çalışma dizinine yerleştirilmesi aslında desteklenir, yalnızca varsayılan olarak devre dışı bırakılır. Görmek:h 'exrc':h startup için ve ayarlar , geçerli 'exrc'dizinden okumayı etkinleştirir .vimrc.

Ayrıca tavsiye edilir :set secure kullanırken . Bu , geçerli dizinde kilitler :autocmd, kabuk ve yazma komutları sağlar .vimrc.

Bakmaya değer başka bir şey :h sessionde proje için standart bir görünüm ve ayarlarla bir oturum ( ) ayarlamaktır.

Tüm bunlar, muhtemelen Luc Hermitte tarafından detaylandırılan eklenti seçeneği ile giderdim.


6
Lütfen fen tarafından yapılan yoruma bakınız. Bu, ciddi güvenlik sonuçlarına yol açabilir.
verileri

11

Bugünlerde HERHANGİ BİR "otomatik çalıştırma" özelliği ile güvenlik risklerini en aza indirmek için, eklentiler (taşınabilirlik bagajı) yerine vim'in mevcut özelliklerini kullanmanızı tavsiye edebilir miyim?

Örneğin.

Yerel klasörümün vimrc dosyasının adı "_gvimrc" (özellikle). Bu, fen gibi insanların, pahasına eğlenme ümidini azaltır. :-)

$ VIM / .vimrc dosyama şunu ekledim:

if filereadable("_gvimrc")
    source _gvimrc
endif

sonunda.

"Fileexists ()" yerine "filereadable ()" kullanıyorum çünkü daha sonra aynı anda birden fazla (10+) dosya açarak işkence gördüğünde bazı tuhaflıklar oluyor (neden emin değilim).

Elbette, potansiyel sorun çıkarıcıları daha da karmaşık hale getirmek için kendi benzersiz dosya adınızı verebilirsiniz. "_Mygvimrc", "_gobbledygook", vb. Gibi, tek bir standart ad üzerinde anlaşmanız ve bunu $ VIM / .vimrc dosyanıza buna göre kaynak olarak vermeniz gerekir. Bunun için vi / vim dahili bileşenlerine güvenmek taşınabilirlik sorunlarını ortadan kaldırır. ANCAK, $ VIM / .vimrc dosyasını daha sonra vim ile düzenlemeniz durumunda, yinelemeli kaynak kullanımını önlemek için .vimrc (veya _vimrc) olarak adlandırmayın.

Bunu Windoze 98SE'den beri, Windork XP Pro aracılığıyla ve şimdi Windorkier 7 (zaten 5+ yıldır) kullanıyorum. Explorer'da .txt dosyalarının bir listesini işaretleyeceğim ve ardından "Birden çok Vim ile Düzenle" yi kullanacağım, bu da aynı anda birden çok vim penceresinin açılmasına neden olacak. İşim için bunu günde birkaç kez yapıyorum. Tüm dosyalar, yerel _gvimrc dosyamda ayarladığımla işlendi.


Burada, bu local_vimrc eklentileri (en azından benimki) taşınabilir olduğundan (çeşitli farklı işletim sistemlerinde ve hatta Windows 95'te korunuyordu) burada, eklenti taşınabilirliğine olan güvensizliğin temeli yoktur. Güvenlik riskiyle ilgili konu da abartılıyor: Bu yolu izlersek, işimizi kolaylaştıracak hiçbir şey yüklemeyeceğiz.
Luc Hermitte

Ancak, ilgilendiğim kadarıyla, ilk gerçek sorun, yaklaşımınızla birlikte, _gvimrc dosyasını içeren dizinden çalışmanız gerektiğidir (gvim'e özgü şeyler içermesi gerektiği için kötü bir isimdir). Projeniz, ortak bir yapılandırma gerektirebilecek birkaç dizinden ve belirli dizinlerden oluşuyorsa (birden fazla modül olması durumunda), bu, sınırlamalarını hızla gösterecektir.
Luc Hermitte

İkinci sorun, aynı anda yalnızca bir proje üzerinde çalışabilmenizdir - OTB, openjpeg ve her iki kütüphaneyi de içine alan bir proje üzerinde çalışmak istersem, bu çözüm her biri için belirli bir ayara sahip olmama izin vermez. üç proje.
Luc Hermitte

Bu aynı zamanda yerel bir dizinden bir sözdizimi dosyası yükleyerek papatya dizimi şeklinde çalışır.
maharvey67

2

İnsanların birkaç günde bir dosya eklemediğini varsayarsak, muhtemelen her dosyanın en üstüne bir modelin ekleyebilirsiniz. Aslında, sürüm kontrol sisteminiz izin veriyorsa, her dosyanın teslim edildiğinde bir modeline sahip olması gerektiğini söyleyen bir kuralı uygulayabilirsiniz.



2

"Editorconfig" i kullanın

Uygulamak istediğiniz kodlama standartları türleri girinti stili, sekme boyutu, dosya formatı ve karakter kümesiyle ilgiliyse , bu tür ayarları belirli bir proje ve tüm editörlerin bu konfigürasyonu izlemesini sağlayın.

"Editorconfig" özelliği, projelerin dosya uzantılarına veya proje içindeki adlara bağlı olarak farklı ayarlar istemesine izin verir. (Böylece, TAB'ları kullanarak Makefiles'a, 4 boşluk kullanan Python komut dosyalarınıza ve girinti için 2 boşluk kullanan kabuk komut dosyalarınıza sahip olabilirsiniz.)

Vim'de "editorconfig" i kullanmak için bir eklentiye ihtiyacınız var. Resmi web sitesi bir tane sağlar, ancak şahsen , saf Vimscript ile yazılmış sgur / vim-editorconfig'i öneririm, böylece harici bağımlılıklar hakkında çok fazla endişelenmenize gerek kalmaz.

"Editorconfig", editörler arası uyumluluğu hedeflediğinden, yaptığı şey oldukça sınırlıdır, bu nedenle tutarlı bir boşluk, dosya biçimi (DOS'a karşı Unix) ve kodlama (Unicode utf-8, vb.), Ardından "editorconfig " senin için.



0

Var olan ve hiçbirinden hoşlanmayan eklentilere baktım, bu yüzden vim-fugitive'i destekleyen basit bir işlev yazdım . Bunun avantajı, projenin kökünün her zaman deponun kökü olduğunu bilmesidir ve ayrıca bir güven tablosu tutmak için dosyaya hash uygulayabilirim. Aşağıdakileri .vimrcdosyanıza koyun .

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 ^= !

Eğer !seçenek ayarlanır viminfoayarı, daha sonra SAFE_VIMRCsözlüğü (not koşular arasında korunacaktır ^o kadar karışıklık değil böylece seçeneği başa ekleyerek nseçeneği).

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.