कमांड या लोकल vimrc फ़ाइलों के साथ कई vim कॉन्फ़िगरेशन के बीच कैसे स्विच करें?


85

मैं कई समूहों में काम करता हूं, जिनमें से प्रत्येक का अपना टैब / इंडेंटेशन / स्पेसिंग सी में मानक हैं।

क्या प्रत्येक के लिए अलग-अलग चयन करने योग्य VIM कॉन्फ़िगरेशन रखने का कोई तरीका है, जब मैं किसी फ़ाइल को संपादित करता हूं, या तो:

  • मैं set group=1कॉन्फ़िगरेशन का चयन करना पसंद करता हूं
  • एक स्थानीय .vimrc जो वर्किंग डायरेक्टरी में रहता है, इसका उपयोग कॉन्फ़िगरेशन को स्वचालित रूप से सेट करने के लिए किया जाता है


जवाबों:


40

संक्षेप में

ऐसा करने के कुछ तरीके हैं, जिनमें से अधिकांश का सुझाव दिया गया है, लेकिन मुझे लगा कि मैं उन्हें दो अतिरिक्त लोगों के साथ संक्षेप में बताऊंगा:

  • प्रति-निर्देशिका vimrc - नुकसान यह है कि Vim को सही निर्देशिका में शुरू किया जाना चाहिए: यदि आपका प्रोजेक्ट अंदर है ~/project1और आपके पास है ~/project1/.vim.customऔर क्या है cd ~ ; vim project1/file.c, तो कस्टम सेटिंग्स नहीं मिलेगी।
  • मॉडलाइन - बहुत प्रभावी, लेकिन उन्हें सभी फ़ाइलों में जोड़ने की आवश्यकता का नुकसान है (और उन्हें नई फ़ाइलों में जोड़ना याद रखें)
  • निर्देशिका विशिष्ट ऑटोकॉमैंड्स - यह बहुत प्रभावी है
  • फ़ाइल में एक विशिष्ट हेडर के लिए स्कैन करें (नीचे देखें) - यह वह है जिसका मैंने अतीत में सबसे अधिक उपयोग किया है जहां विभिन्न कंपनियों के लिए काम कर रहा है या स्पष्ट रूप से परियोजनाओं के लिए काम कर रहा है
  • फ़ाइल को खोले जाने पर प्रति-निर्देशिका vimrc की जाँच की जाती है (नीचे देखें)। लागू करने के लिए एक और काफी आसान है, खासकर अगर आपका प्रोजेक्ट कोड एक ही स्थान पर है।

एक हेडर के लिए स्कैनिंग

बहुत सारे संगठनों में, हर स्रोत फ़ाइल के शीर्ष पर एक मानक हेडर (कॉपीराइट नोटिस और प्रोजेक्ट नाम आदि के साथ) होता है। यदि यह मामला है, तो आप विम को स्वचालित रूप से पहली (उदाहरण के लिए) फ़ाइल की 10 पंक्तियों को स्कैन कर सकते हैं। यदि यह मिल जाता है, तो यह आपकी सेटिंग्स को बदल सकता है। मैंने इसे अपने द्वारा उपयोग किए जाने वाले फॉर्म की तुलना में सरल बनाने के लिए संशोधित किया है (जो अन्य बहुत सारी चीजें करता है), लेकिन एक बनाएं ~/.vim/after/filetype.vim(यदि आपके पास अभी तक नहीं है) और कुछ इस तरह जोड़ें:

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

जब भी किसी प्रकार की फ़ाइल खोली जाती है और फ़ाइल प्रकार सेट किया जाता है ( au FileType *लाइन),ConfigureFiletypes फ़ंक्शन को कहा जाता है। यह जाँचता है कि क्या फ़ाइल प्रकार वर्तमान समूह (GROUPNAME) से जुड़े फ़ाइल प्रकारों की सूची में है, इस मामले में 'c', 'cpp', 'vhdl' या 'c.doxygen'। यदि यह है, तो यह CheckForGROUPNAMECode () को कॉल करता है, जो फ़ाइल की पहली 10 पंक्तियों को पढ़ता है और यदि उनमें GROUPNAME होता है, तो यह कुछ अनुकूलन करता है। एक्सपैंटेबस या जो कुछ भी सेट करने के साथ, यह समूह नाम को स्पष्ट रूप से दिखाने के लिए स्टेटस बार भी बदलता है ताकि आप जान सकें कि यह एक नज़र में काम कर रहा है।

खुलने पर कॉन्फ़िगरेशन की जाँच करना

जेएस बैंग्स के सुझाव की तरह, एक कस्टम कॉन्फ़िगरेशन फ़ाइल उपयोगी हो सकती है। हालाँकि, इसे vimrc में लोड करने के बजाय, इस तरह से कुछ पर विचार करें, जो .c फ़ाइल को .c फ़ाइल के समान निर्देशिका में .vim.custom के लिए खोले जाने पर जाँच करेगा।

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

मेरे पास यह है $HOME/.vimrc:

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

यह मुझे .vim.customउस डायरेक्टरी के लिए कमांड और ऑप्शन को लोड करने के लिए हर डायरेक्टरी में एक फाइल रखने की अनुमति देता है । यदि आप ऐसे कई प्रोजेक्ट्स पर काम कर रहे हैं, जिनमें डीप डायरेक्टरी स्ट्रक्चर्स हैं, तो आपको कुछ और अधिक परिष्कृत (उदाहरण के लिए डायरेक्टरी ट्री तक चलने की आवश्यकता हो सकती है.vim.custom है) की , लेकिन एक ही मूल विचार काम करेगा।

अपडेट करें:

मैं अब इस तरह से कुछ करता हूं ताकि .vimमैं जिस फाइल को एडिट कर रहा हूं, उसी डायरेक्टरी की फाइल को रीड कर सके , भले ही करंट डायरेक्टरी कैसी भी हो।

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

1
यह कमाल है, मैंने यह कभी नहीं देखा है!
जिम मिचनर

1
यह उन परियोजनाओं के लिए एक महान समाधान है जो रेपो में रहते हैं!
बजे

2
'exrc'विकल्प पहले से ही बहुत ही इस के लिए इसी तरह कुछ कर रही है। यह एक लोड होगा .vimrc/ .exrc/ .gvimrcवर्तमान कार्यशील निर्देशिका में।
जामसेन

इसके बारे में टिप्पणी exrcका सही उत्तर होना चाहिए। बाकी सब कुछ ओ हैकली और जटिल लगता है।
सिल्वन

उपयोग करना exrcअच्छा है, लेकिन मैं सही फ़ाइल प्राप्त करने की सराहना करता हूं तब भी जब मैं उसी कार्य निर्देशिका में नहीं हूं जिस फ़ाइल का मैं संपादन कर रहा हूं।
जेएसबी JS

34

आप ऑटोकॉमैंड्स को भी अपने में डाल सकते हैं .vimrcजो प्रति-पथ के आधार पर विशिष्ट विकल्प निर्धारित करते हैं।

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

यह बहुत अच्छा है जब आप रिपॉजिटरी के नियंत्रण में नहीं होते हैं ताकि आप ".vim.custom" फ़ाइलों को वहां न रख सकें। मुझे यह पसंद है कि यह भंडार को साफ रखता है। धन्यवाद। डिस्क्लेमर: यदि मार्ग एक गैर-पैटर्न के अनुकूल तरीके से बदलता रहता है, तो ".vim.custom" संस्करण संभवतः एक अच्छा विकल्प है, जिसे मानकर एक रिपॉजिटरी को संशोधित किया जा सकता है।
lpapp

17

प्लगइन सही काम कर रहा है: http://www.vim.org/scripts/script.php?script_id=441

“यह प्लगइन वर्तमान में खोली गई फ़ाइल के फाइल सिस्टम ट्री में स्थानीय vimrc फ़ाइलों की खोज करता है। डिफ़ॉल्ट रूप से यह फ़ाइल की निर्देशिका से रूट निर्देशिका तक सभी ".lvimrc" फ़ाइलों की खोज करता है और उन्हें रिवर्स ऑर्डर में लोड करता है। लोड की गई फ़ाइलों का फ़ाइल नाम और मात्रा वैश्विक चर के माध्यम से अनुकूलन योग्य है। "


3
और github संस्करण भी रोगज़नक़ के साथ लोडिंग का समर्थन करता है :-)
Graza

एक अन्य समान प्लगइन स्थानीयकरण है। यह फ़ाइल-विशिष्ट-प्रति-निर्देशिका सेटिंग की भी अनुमति देता है; मुझे यह अपरिहार्य लगता है। vim.org/scripts/script.php?script_id=3393
इंगो करकट

12

अपने साथी डेवलपर्स को इसके बारे में शिकायत नहीं करने पर, आप हमेशा टिप्पणी में प्रत्येक फ़ाइल में विम सेटिंग्स जोड़ सकते हैं।

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

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

2
मैं केवल हूँ अहम , मेरे टीमों के सबसे पर प्रबुद्ध देव ताकि कोई भी मन चाहिए। यह एक बहुत साफ प्रति फ़ाइल समाधान है।

1
मैं उन्हें सबसे नीचे जोड़ना पसंद करता हूं ताकि वे विनीत हों, लेकिन मुझे लगता है कि यह स्टाइल की बात है।
nyuszika7h 16

5

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

तैरने की कोशिश करो।


तैरना

swimvimrc फ़ाइलों को स्विच करने और सुविधाजनक उपनाम बनाने के लिए एक त्वरित उपकरण है। यहाँ एक छोटी उपयोग सूची है। एक पूर्वाभ्यास gif के लिए Github रेपो देखें और निर्देश डाउनलोड करें:


प्रयोग

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

अधिक पढ़ें

https://github.com/dawsonbotsford/swim


4

पिछले पोस्टर द्वारा सुझाए गए localvimrc प्लगइन को आज़माने के बाद, मुझे रिम सेटिंग्स पर गैर-वायदा प्रति-प्रोजेक्ट नियंत्रण रखना बहुत पसंद है।

यह डिफ़ॉल्ट रूप से .lvimrc फ़ाइल लोड करने से पहले पुष्टिकरण पूछता है लेकिन स्वचालित रूप से .lvimrc फ़ाइलों को लोड करने के लिए एक सेटिंग है। कुछ लोग इसे सुरक्षा छेद के रूप में देख सकते हैं, लेकिन यह विज्ञापित के रूप में काम करता है।

मैंने .lignor .lvimrc फ़ाइलों को चुना है। वैकल्पिक रूप से आप उन्हें साझा सेटिंग्स (टैब / अंतरिक्ष विस्तार, टैबस्टॉप, अन्य प्रोजेक्ट-विशिष्ट सेटिंग्स) के रूप में देख सकते हैं।


1
यह स्क्रिप्ट अद्भुत है: github.com/MarcWeber/vim-addon-local-vimrc । 1) यह अब केवल एक बार पूछता है और फ़ाइल हैश को ओके के रूप में चिह्नित करता है। 2) यह डायरेक्टरी ट्री को रूट से करंट डायर तक पहुंचाता है, जो अंतिम उच्च प्राथमिकता वाली फाइल्स को सोर्स करता है।
सिरो सेंटिल्ली 郝海东 i iro i 法轮功 '

.lvimrcफ़ाइल को क्यों जोड़ें .gitignore? मुद्दा यह है कि हर कोई जो विम का उपयोग करता है और इंस्टॉल किए गए प्लगइन को एक ही सेटिंग मिलती है।
nyuszika7h

2
@ nyuszika7h कुछ सेटिंग्स लागू की जानी चाहिए, जबकि अन्य विशुद्ध रूप से व्यक्तिगत हैं। सेटिंग्स के लिए जिसे सभी के लिए लागू किया जाना चाहिए, EditorConfig और भी बेहतर है क्योंकि यह संपादक अज्ञेयवादी है: github.com/editorconfig/editorconfig-vim
Ciro Santilli 郝海东 en en en 法轮功

1

जैसा कि स्लेज द्वारा बताया गया है कि प्लग-इन का उपयोग सबसे अच्छा विकल्प है जिसे मैंने देखा है और उपयोग करता है। जर्सीबॉय ने टिप्पणी की कि उपयोगिता ने लोड करने से पहले पुष्टि करने की सिफारिश की है (यानी हर फाइल खोलने के बाद)। इससे बचने के लिए बस अपने .vimrcस्थानीय .lvimrcफाइलों की सूची निर्धारित करें:

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


1

यहां जामेसन पर भिन्नता है

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

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


ठीक वही जो मेरे द्वारा खोजा जा रहा था। उपयोग के एक उदाहरण के रूप में: मैंने इस कोड को अपनी सिम्फनी प्रोजेक्ट्स निर्देशिका में ~/.vimrcबदल दिया /src/mobile(मेरे मामले में यह था /www/symfony) और फिर संशोधित .vim.mobileकिया .vim.symfonyगया नया .vimrc ~/.vim.symfonyफ़ाइल के अंदर कॉन्फ़िगर करना
jmarceli

1

मैं कई समूहों में काम करता हूं, जिनमें से प्रत्येक का अपना टैब / इंडेंटेशन / स्पेसिंग सी में मानक हैं।

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

जब autotabविम का सुझाव दिया जाता है, तो हर बार जब आप किसी फ़ाइल को विम में लोड करते हैं, autotabतो उस पर इनवॉइस किया जाता है, और विम सेटिंग्स आउटपुट autotabको पास कर दिया जाता है:set कमांड में ।

autotab, फ़ाइल से कई हजार लाइनों पढ़ता उन्हें विश्लेषण करती है और के लिए सेटिंग्स को निर्धारित करता है expandtab, tabstopऔर shiftwidthमानकों।

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

यह काफी अच्छी तरह से काम करता है कि मैंने एल्गोरिथ्म को सालों पहले ट्विक करना बंद कर दिया था। यदि यह भ्रमित हो जाता है, तो यह लगभग हमेशा होता है क्योंकि फ़ाइल में स्वरूपण समस्याएँ होती हैं, जैसे एक ही समय में कई सम्मेलनों का उपयोग।

यह फ़ाइल प्रकार का "अज्ञेयवादी" भी है और विभिन्न भाषाओं के साथ अच्छी तरह से काम करता है। मैं इसका उपयोग केवल C पर ही नहीं करता, बल्कि शेल स्क्रिप्ट, लिस्प, मेकफाइल्स, एचटीएमएल और आपके पास क्या है।

ध्यान दें कि यह स्वरूपण के अन्य मापदंडों को संभाल नहीं सकता है, जो परियोजना-विशिष्ट हो सकता है, उदाहरण के लिए, सी फ़ाइलों में, चाहे caseएक switchस्टेटमेंट में लेबल इंडेंट किए गए हों या नहीं, या लिपटे फ़ंक्शन तर्क सूचियां केवल इंडेंट की गई हैं, या गठबंधन की गई हैं तर्क सूची के कोष्ठक खोलना। विम के पास उस तरह की चीज़ों के लिए सेटिंग्स हैं, और इसलिए शैली का विश्लेषण करने और उन मापदंडों को आउटपुट करने के लिए कार्यक्रम को काफी बढ़ाया जा सकता है।


0

ज्यादातर उसी मुद्दे की तलाश में मुझे सॉस प्लग-इन भी मिला: http://www.vim.org/scripts/script.php?script_id=3992

यह दावा करता है:

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

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

मुझे अभी इसका परीक्षण करना बाकी है।


0

आप स्विचिंग कॉन्फ़िगरेशन के लिए स्टोव का उपयोग कर सकते हैं (किसी भी dotfiles, न केवल .vimrc)

स्थापित करें stow:

$ apt install stow

प्रत्येक कॉन्फ़िगरेशन के लिए कई निर्देशिकाएं बनाएं:

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

.vimrcउन में अलग रखो :

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

अब आप इस कमांड के साथ vim-golang कॉन्फिगर को इंस्टेंट कर सकते हैं (इसे डॉटफाइल्स डायरेक्टरी के अंदर चलाया जाना चाहिए):

~$ cd ~/dotfiles

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

अब यह जुड़ा हुआ है:

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

यदि आपको कॉन्फ़िगर करने की आवश्यकता है, तो बस फिर से stow:

~$ 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

इसके बारे में यहाँ और अधिक पढ़ें: GNU स्टोव के साथ प्रबंध dotfiles

पेशेवरों : बहुत आसान है, कोई भी प्लगइन प्लगइन निर्भरता, सभी dotfiles के प्रबंधन के लिए इस्तेमाल किया जा सकता है, न केवल .vimrc

विपक्ष : कॉन्फ़िगरेशन एक-दूसरे से स्वतंत्र हैं, आपको उनमें से प्रत्येक को अलग से प्रबंधित / अपडेट करने की आवश्यकता है (यदि आप स्विच नहीं करते / अपडेट करते हैं तो आप अक्सर कॉन्फ़िगर करते हैं - यह मुद्दा नहीं होगा)।

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