विम: निर्देशिका में फ़ाइलों पर सेटिंग लागू करें


103

मैं वर्तमान निर्देशिका के अंतर्गत सभी फ़ाइलों के लिए विम सेटिंग्स कैसे निर्दिष्ट करूं?

आदर्श समाधान यह होगा कि विम ने ~ / .vimrc की खोज करने से पहले वर्तमान निर्देशिका में .vimrc को खोजा और पढ़ा, और वहां पूरे पेड़ के लिए सेटिंग लागू करें।

मैंने एक प्लगइन देखा है , लेकिन इसका मतलब है कि लागू सेटिंग्स पारदर्शी नहीं हैं क्योंकि उन्हें प्लगइन स्थापित करने की आवश्यकता होती है। इसके विपरीत, एक उपयोगकर्ता के vimrc या विशिष्ट vim आह्वान की परवाह किए बिना एक मॉडल पारदर्शी है, उस फ़ाइल के लिए मॉडलइन सेटिंग्स लागू की जाएंगी।

मैंने जो कोशिश की वो हैं

  • वर्किंग डायरेक्टरी में -vimrc रखकर
  • :so vimrc मॉडल में।

मुझे लगता है कि दोनों सुरक्षा कारणों से काम नहीं करते हैं। मुझे एक विमकेन की पूरी शक्ति की आवश्यकता नहीं है; एक मॉडल द्वारा स्वीकार्य सेटिंग्स के लिए बाध्य होना पर्याप्त होगा। मेरा लक्ष्य किसी परियोजना में कोडिंग मानकों को अपनाने के लिए विमर्स के लिए इसे आसान बनाना है।


जवाबों:


42

मैं प्लगइन रास्ते का एक वकील हूँ । कई कारणों के लिए:

  • मॉडलाइन विशेष रूप से सीमित हैं: हम चर (जो अन्य धुनों (फीट)) को सेट नहीं कर सकते हैं, जैसे "फॉर-स्निपेट का ब्रेसिज़ एक नई रेखा पर होना चाहिए?"), या उनसे फ़ंक्शन को कॉल करें (मैं खुद को सीमित नहीं करता हूं) मानकों को कोडित करने के लिए, मैं भी वर्तमान निर्देशिका के आधार पर उपयोग करने के लिए मेकफाइल सेट करता हूं)
  • DRY : मॉडलइन के साथ, हर फाइल में एक सेटिंग को दोहराया जाना चाहिए, अगर सेट करने या बदलने के लिए बहुत सारी चीजें हैं, तो इसे बनाए रखना मुश्किल हो जाएगा, इसके अलावा, इसे टेम्प्लेट-विस्तारक प्लगइन के उपयोग की आवश्यकता होगी ( जो आपको विचार करना चाहिए कि क्या आपके प्रोजेक्ट में कई विमर्स हैं)।
  • हर कोई विकसित करने के लिए विम का उपयोग नहीं करता है। मैं अन्य लोगों के संपादक सेटिंग्स से परेशान नहीं होना चाहता, मुझे उनका परजीवी क्यों बनना चाहिए?
  • नकल करने वालों को कॉपी-पेस्ट करने, और बनाए रखने के बजाय उनके .vimrc में समान पंक्तियों को स्थापित करने के लिए विमर्स से पूछना आसान है।
  • सेटिंग्स को अन्य प्रोजेक्ट फाइलों (cvs / svn / git / जो भी हो) के साथ सहेजा जा सकता है
  • प्रति प्रोजेक्ट के लिए कॉन्फ़िगरेशन फ़ाइल रखना वास्तव में आसान है - प्लगइन के साथ, मेरे पास समग्र प्रोजेक्ट के कोडिंग मानकों के लिए एक वैश्विक कॉन्फ़िगरेशन फ़ाइल है, और प्रत्येक उप-परियोजना के लिए विशिष्ट कॉन्फ़िगरेशन फ़ाइल (जो उपयोग करने के लिए मेकफाइल है, जिसे कॉल करने के लिए निष्पादन योग्य है , ...)

BTW, sth के समाधान का उपयोग एकल विन्यास फाइल को स्रोत बनाने के लिए किया जा सकता है। यह .vrc को छोड़कर गैर वैश्विक विकल्पों के साथ जोड़ा जाना है, और यह आसानी से एकाधिक / साझा कॉन्फ़िगरेशन फ़ाइलों का समर्थन नहीं करता है।


मैंने देखा कि आपको सही तरीके से प्लगइन को निष्पादित करने से पहले पथ में एक नई फ़ाइल को सहेजना होगा
cmcginty

वास्तव में। प्लगइन्स का यह परिवार एक रूपरेखा को परिभाषित करता है। आपको अभी भी किसी फ़ाइल में प्रोजेक्ट की विशिष्ट परिभाषाएँ लिखनी हैं - यह कि यह ढांचा अपने आप स्रोत बन जाएगा।
ल्यूक हरमिट

1
कृपया ध्यान दें, ल्यूक अपने खुद के एक प्लगइन लिंक। यह सवाल में जुड़े एक से बेहतर काम करता है। धन्यवाद।
डेटा

कुंआ। मैं बता नहीं सकता। जैसा कि मैं वर्षों से मेरा उपयोग कर रहा हूं, मैंने अन्य कार्यान्वयनों पर कभी भी ध्यान नहीं दिया है। समय-समय पर मुझे एक बग रिपोर्ट मिलती है जिसे मैं अंत में ध्यान में रखता हूं। BTW, मेरे संस्करण को टेम्पलेट के विस्तार से पहले प्रोजेक्ट-विशिष्ट चर सेट करने के लिए म्यू-टेम्पलेट से पहले ट्रिगर किया जा रहा है (जो कि वर्तमान प्रोजेक्ट रूट डायरेक्टरी को लाने और विस्तारित किए गए
मार्ग

1
@JasonMcCarrell मेरे स्थानीय_वीम आर्क और मार्कस "इम्प्रेस" के कार्यान्वयन में ब्रौन का एक ब्लैकलिस्ट, श्वेतसूची के लिए समर्थन है ... यदि आपको केवल यह निर्दिष्ट करने की आवश्यकता है कि इंडेंटेशन कैसे किया जाता है, तो EditorCarfig-vim प्लगइन एक बेहतर विकल्प होगा।
ल्यूक हरमिट

91

आप इस तरह से कुछ डाल सकते हैं $VIM/vimrc

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

1
यह पुनरावर्ती है, लेकिन केवल * के साथ। यदि आप इसे / path / to / files / या path / to / files में कम करने की कोशिश करते हैं तो यह काम नहीं करेगा।
SystemParadox

यह बहुत अच्छा है अगर आपकी परियोजना में "noexpandtab" के साथ लिखी गई फ़ाइलों का एक पेड़ है और सभी फ़ाइलों के साथ एक और पेड़ "एक्सपैंडटैब" (जैसे कोडआईग्निटर) है। आप प्रत्येक पेड़ में फ़ाइलों के लिए उचित कार्रवाई को एक विन्यास फाइल के साथ व्यक्तिगत रूप से सेट कर सकते हैं।
user9645

2
अजीब तरह से, यह तब काम नहीं किया जब मेरे रास्ते में एक सिमलिंक शामिल था; काम करने से पहले मुझे कोई सहानुभूति के साथ पूरा रास्ता रखना पड़ा।
डोलन एंटेनुची 20

विकल्प के रूप में "विश्वसनीय विम" ​​का उपयोग करने के बारे में joseph07 का उत्तर देखें, इस दृष्टिकोण का उलटा (वितरित .vimrc बनाम केंद्रीकृत)।
नाथन शुल्टे

50

मैं दृढ़ता से उपयोग न करने का सुझाव दूंगा set exrc

यहां तक ​​कि set secure, * निक्स के तहत, अगर आप फ़ाइल के मालिक हैं, तो विम भी ऑटोकॉमैंड, शेल, एट अल चलाएगा। तो अगर आप उस टैरबॉल में एक फ़ाइल को संपादित करने के लिए खुश हैं जिसे मैंने आपको एक .vimrcयुक्त के साथ भेजा है :

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

आप शायद मुझसे कम खुश होंगे।


6
यह उन प्लगइन्स के साथ भी सच है जो विम लोड होने पर स्वचालित रूप से निष्पादित होते हैं।
१२:१३ पर ल्यूक हरमिट

31

यह सवाल पुराना है, लेकिन यह एक बहुत ही स्वाभाविक और लगातार चिंता का विषय है।

मेरा समाधान बहुत सरल है। मैं .vimrcअपनी परियोजनाओं की मूल निर्देशिका में एक फ़ाइल रखता हूँ। .vimrcफ़ाइल की पहली पंक्ति आमतौर पर स्रोत होती है ~/.vimrc, और फिर मैं चाहता हूं कि विशेष कॉन्फ़िगरेशन जोड़ता है। मैं अपने व्यक्तिगत प्रोजेक्ट निर्देशिकाओं में उपनाम tvim='vim -u .vimrc'और उपयोग करता tvimहूं। "विश्वसनीय" के लिए "tvim", जिसका अर्थ है कि अगर मैं इसे एक .vimrcफ़ाइल के साथ एक निर्देशिका में निष्पादित करता हूं और कुछ गलत हो जाता है, तो मुझे दोष देने के लिए कोई नहीं है, लेकिन खुद को, क्योंकि मैंने स्पष्ट रूप से कहा था कि मैंने इस पर भरोसा किया है। इसके अलावा, मैं इन संग्रहित समूहों को दूर रखता हूं ताकि मैं कभी-कभी किसी विशेष प्रकार की परियोजना के लिए जो चाहूं उसे नरम कर सकूं।


1
यह दृष्टिकोण सीधा है और मेरी जरूरतों से पूरी तरह मेल खाता है।
जिंक्ड

जब मैं यह कोशिश करता हूं और source $HOME/.vimrcअपने स्थानीय से .vimrc, विम शिकायत करता है कि यह मेरे सिस्टम में स्थापित प्लगइन्स नहीं पा सकता है (इस मामले में रोगज़नक़; execute pathogen#infect()कमांड मेरे $HOME/.vimrcसाथ विफल रहता है Unknown function ...)। मैं इसे कैसे ठीक करूं?
नाथन शुल्टे

20

कार्यशील निर्देशिका में .vimrc रखने का वास्तव में समर्थन किया जाता है, केवल डिफ़ॉल्ट रूप से अक्षम होता है। देखें :h 'exrc'और :h startupविवरण के लिए, सेटिंग वर्तमान निर्देशिका से 'exrc'पढ़ने में सक्षम होगी .vimrc

इसका :set secureउपयोग करते समय इसकी सिफारिश भी की जाती है । यह वर्तमान निर्देशिका के :autocmdलिए नीचे , शेल और कमांड को लॉक करता है .vimrc

एक और चीज जो देखने लायक हो सकती है :h sessionवह है परियोजना के लिए एक मानक दृश्य और सेटिंग्स के साथ एक सत्र ( ) स्थापित करना ।

सभी ने कहा, मैं शायद ल्यूक हरमिट द्वारा विस्तृत प्लगइन विकल्प के साथ जाऊंगा।


6
कृपया फेन द्वारा टिप्पणी देखें। इससे गंभीर सुरक्षा निहितार्थ हो सकते हैं।
डेटा

11

इन दिनों किसी भी "ऑटोरन" सुविधाओं के साथ सुरक्षा जोखिम को कम करने के लिए, क्या मैं आपको प्लगइन्स (पोर्टेबिलिटी सामान) के बजाय विम की मौजूदा सुविधाओं का उपयोग करने की सलाह दे सकता हूं?

उदाहरण के लिए।

मेरे स्थानीय फ़ोल्डर की vimrc फ़ाइल का नाम "_gvimrc" (उद्देश्य पर) है। यह हमारे खर्च पर खुद को खुश करने से फेन जैसे लोगों के लिए उम्मीद कम कर देता है। :-)

मेरी $ VIM / .vimrc फ़ाइल में, मैंने डाला:

if filereadable("_gvimrc")
    source _gvimrc
endif

अतं मै।

मैं "फाइलरेस्टिस्ट ()" का उपयोग "फाइलएक्सिस्ट्स ()" के रूप में करता हूं, क्योंकि बाद में कई बार (10+) फाइलों को एक साथ खोलने पर अत्याचार होता है, (निश्चित नहीं क्यों)।

निश्चित रूप से, आप संभावित परेशानी वाले निर्माताओं को आगे बढ़ाने के लिए अपना अनूठा फ़ाइल नाम दे सकते हैं। जैसे कि "_mygvimrc", "_gobbledygook", आदि। आपको बस एक मानकीकृत नाम पर बसने की जरूरत है और इसे आपके $ VIM / .vimrc के अनुसार स्रोत बनाया जाना चाहिए। पोर्टेबिलिटी के मुद्दों के लिए इस नियम के लिए vi / vim इंटर्नल्स पर भरोसा करना। लेकिन, इसे नाम नहीं दें। यदि आप बाद में विम के साथ $ VIM / -vimrc फ़ाइल का संपादन कर रहे हैं, तो पुनरावर्ती सोर्सिंग को रोकने के लिए .vimrc (या _vrcrc) का नाम लें।

Windoze 98SE के माध्यम से Windoze के बाद से इसका उपयोग किया गया है, और अब Windorkier 7 (5+ वर्ष पहले से)। मैं एक्सप्लोरर में .txt फ़ाइलों की एक सूची को चिह्नित करूँगा और फिर "कई Vim के साथ संपादित करें" का उपयोग करूंगा, जिसके परिणामस्वरूप कई vim विंडो एक साथ खुलेंगी। अपने काम के लिए, मैं रोजाना कई बार ऐसा करता हूं। मैंने अपने स्थानीय _gvimrc में जो कुछ भी सेट किया था, उसके साथ सभी फाइलों का व्यवहार किया गया।


यहां, प्लगइन पोर्टेबिलिटी के लिए अविश्वास के पास कोई आधार नहीं है क्योंकि ये local_vimrc प्लगइन्स (कम से कम मेरा) पोर्टेबल हैं (यह विभिन्न विभिन्न ओएस पर बनाए रखा जाता था, और यहां तक ​​कि विंडोज़ 95)। सुरक्षा जोखिम के बारे में मुद्दा भी अतिरंजित है: यदि हम इस तरह से पालन करते हैं, तो हम अपने काम को आसान बनाने के लिए कभी भी कुछ भी स्थापित नहीं करेंगे।
ल्यूक हरमिट

लेकिन, जहां तक ​​मेरा संबंध है, पहला वास्तविक मुद्दा यह है कि, आपके दृष्टिकोण के साथ, आपको सटीक निर्देशिका से काम करना होगा जिसमें _gvimrc फ़ाइल (जो एक बुरा नाम है क्योंकि इसमें gvim विशिष्ट सामग्री शामिल है)। यदि आपका प्रोजेक्ट कई निर्देशिकाओं से बना है, जिसके लिए एक सामान्य कॉन्फ़िगरेशन की आवश्यकता हो सकती है, और विशिष्ट वाले (कई मॉड्यूल के मामले में), तो यह जल्दी से अपनी सीमाओं को दिखाएगा।
ल्यूक हर्मिट्टे

दूसरा मुद्दा यह है कि आप उस समय केवल एक परियोजना पर काम कर सकते हैं - अगर मैं ओटीबी, ओपनजैपर, और एक परियोजना पर काम करना चाहता हूं जो दोनों पुस्तकालयों को प्रभावित करता है, तो यह समाधान मुझे प्रत्येक के लिए एक विशिष्ट सेटिंग नहीं होने देगा। तीन परियोजनाएं।
ल्यूक हर्मिट्टे

यह स्थानीय निर्देशिका से सिंटैक्स फ़ाइल लोड करने के लिए डेज़ी-चेन भी काम करता है।
maharvey67

2

यह मानते हुए कि लोग हर कुछ दिनों में फाइलें नहीं जोड़ रहे हैं, आप शायद प्रत्येक फाइल के शीर्ष पर एक मॉडलइन जोड़ सकते हैं। वास्तव में, यदि आपका संस्करण नियंत्रण प्रणाली इसे अनुमति देता है, तो आप शायद एक नियम लागू कर सकते हैं जो कहता है कि प्रत्येक फ़ाइल में एक मॉडलइन होना चाहिए जब इसे चेक किया गया हो।


2

मैं सुरक्षा कारणों से प्लगइन दृष्टिकोण से सहमत हूं।

एक बहुत अच्छा प्लगइन है जिसका उल्लेख अभी तक नहीं किया गया है। यह आपको .lvimrcअपनी परियोजना निर्देशिकाओं में उपयोग करने देता है ।

"Localvimrc" को आज़माएँ:

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

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


2

"Editorconfig" का उपयोग करें

यदि आप जिस तरह के कोडिंग मानकों को लागू करना चाहते हैं वे इंडेंटेशन स्टाइल, टैब साइज, फाइल फॉर्मेट और चारसेट से संबंधित हैं, तो आप "Editorconfig" पर गौर करना चाहते हैं , जो इस तरह की सेटिंग्स को निर्दिष्ट करने के लिए क्रॉस-एडिटर मानक है एक विशिष्ट परियोजना, और सभी संपादकों को उस कॉन्फ़िगरेशन का पालन करना है।

"Editorconfig" विनिर्देश परियोजनाओं को परियोजना के भीतर फ़ाइल एक्सटेंशन या नामों के आधार पर विभिन्न सेटिंग्स का अनुरोध करने की अनुमति देता है। (इसलिए आप TABs का उपयोग करके मेकफाइल्स हो सकते हैं, 4 स्थानों का उपयोग करके आपकी पायथॉन स्क्रिप्ट और इंडिकेशन के लिए 2 स्पेस का उपयोग करके आपकी शेल स्क्रिप्ट।)

आपको विम में "Editorconfig" का उपयोग करने के लिए प्लग-इन की आवश्यकता है। आधिकारिक वेबसाइट एक प्रदान करती है, लेकिन व्यक्तिगत रूप से मैं sgur / vim-editorconfig की सिफारिश करूंगा , जो शुद्ध Vimscript में लिखा गया है, इसलिए आपको बाहरी निर्भरता के बारे में बहुत अधिक चिंता करने की आवश्यकता नहीं है।

चूंकि "Editorconfig" का उद्देश्य क्रॉस-एडिटर संगतता है, इसलिए यह बहुत सीमित है कि यह क्या करता है, इसलिए यदि आप चाहते हैं कि लगातार व्हाट्सएप, फ़ाइल प्रारूप (DOS बनाम Unix) और एन्कोडिंग (यूनिकोड utf-8, आदि), तो "Editorconfig" " आप के लिए है।



0

मैंने उन प्लगइन्स को देखा जो अस्तित्व में थे और उनमें से किसी को भी वास्तव में कल्पना नहीं की थी, इसलिए मैंने एक साधारण फ़ंक्शन लिखा था जो कि पिग बैक पर विम-भगोड़ा था । इसका लाभ यह है कि यह जानता है कि परियोजना की जड़ हमेशा रिपॉजिटरी की जड़ है, और इसके अलावा मैं विश्वास तालिका रखने के लिए फ़ाइल को हैश कर सकता हूं। बस अपनी .vimrcफ़ाइल में निम्नलिखित डालें ।

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

यदि !विकल्प viminfoसेटिंग पर सेट किया गया है, तो SAFE_VIMRCशब्दकोश रन के बीच संरक्षित किया जाएगा ( ^विकल्प को प्रस्तुत करने के लिए नोट करें ताकि यह विकल्प गड़बड़ न हो n)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.