मैं अपने स्थानीय vimrc में अतिरिक्त सिंटैक्स हाइलाइटिंग नियम कैसे जोड़ सकता हूं?


12

मैंने फेडोरा और विन 7 दोनों पर जीवीएम स्थापित किया। मैंने पाया कि फेडोरा पर vim और gvim दोनों ने c कोड में फ़ंक्शन नाम को उजागर नहीं किया जबकि win7 पर gvim ने इसे हाइलाइट किया।

मैंने पाया कि win7 vim73/syntax/c.vimपर, अंत में अतिरिक्त लाइनें हैं:

syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
hi cFunction gui=NONE guifg=#B5A1FF

अगर मैं इन पंक्तियों को c.vimफेडोरा पर जोड़ता हूं , तो gvim फ़ंक्शन के नाम को भी उजागर कर सकता है।

पोर्टेबिलिटी बनाए रखने के लिए, मैं .vimrcफ़ंक्शन नाम को हाइलाइट करने के लिए बस संशोधित करना चाहता हूं । हालाँकि इन लाइनों को जोड़ने के बाद .vimrc, यह काम नहीं किया।

तो, क्या कोई मेरी मदद कर सकता है? मैंने एक खोज की और विम में फ़ंक्शन नामों को उजागर करने के लिए कई समाधान हैं। लेकिन मैं सिर्फ इस बारे में उत्सुक हूं कि इन लाइनों को कैसे काम किया जाए .vimrc। बहुत बहुत धन्यवाद!


5
~/.vim/after/syntax/c.vimइसके बजाय इसे जोड़ने का प्रयास करें ।
मूरू

@ ममरू हां, यह काम करता है। लेकिन इसे जोड़ने के बारे में कैसे .vimrc?
तमलो

आपको शायद कुछ का उपयोग करना होगा autocmd BufEnter *.c hl ..., लेकिन आपको इसे रखना चाहिए after/syntax/c.vim। विम का कोई भी आधुनिक संस्करण .vim/after/निर्देशिका को समझेगा । विंडोज पर, पथ होगा vimfiles/after/..., इसलिए पोर्टेबिलिटी बहुत अधिक समस्या नहीं होनी चाहिए (विशेषकर यदि आप किसी भी प्लगइन्स का उपयोग करते हैं)।
मूरू

जवाबों:


15

हालाँकि इन पंक्तियों को .vimrc में जोड़ने के बाद, यह काम नहीं किया।

इसका कारण यह है कि विम 'syntax'विकल्प को सेट करते समय मौजूदा सिंटैक्स आइटम को साफ़ करता है। ऐसा इसलिए किया जाता है क्योंकि पुराने सिंटैक्स आइटम को रखने से कुछ अजीब स्थिति पैदा होती है; यदि आपके पास एक बफर है जो आपके पास है syntax=fooऔर उपयोग करता है, set syntax=barतो आप एक बफर के साथ समाप्त हो जाएंगे जिसमें वाक्यविन्यास दोनों के लिए हाइलाइटिंग है fooऔर bar

जब विम शुरू होता है vimrc( आपके स्टार्टअप पर) एक बार लोड होता है , लेकिन यह हर बार filetypeया syntaxविकल्पों को सेट करने के लिए फ़िलाटाइप और सिंटैक्स फ़ाइलों को लोड करता है , जो आपके द्वारा सेट किए गए मानों को रीसेट कर देगा।

यहां तक ​​कि अगर यह इसे रीसेट नहीं करेगा, तो यह आपके vimrc में जोड़ने के लिए एक अच्छा विचार नहीं होगा, क्योंकि यह सभी बफ़र्स पर लागू होगा , और न केवल बफ़र्स के साथ syntax=c


नीचे दिया गया पाठ विम को एक यूनिक्स-वाई सिस्टम पर मानता है, लेकिन यह Neovim और Windows उपयोगकर्ताओं के लिए भी काम करेगा:

  • Neovim उपयोगकर्ताओं के ~/.vim/साथ प्रतिस्थापित करना चाहिए ~/.config/nvim/
  • विंडोज उपयोगकर्ताओं के ~/.vim/साथ प्रतिस्थापित करना चाहिए %USERPROFILE%\vimfiles\

संपूर्ण फ़ाइल को ओवरराइड करना

किसी चीज को बदलने का सबसे आसान तरीका सिर्फ उसे ओवरराइड करना है । ऐसा करने के लिए एक फ़ाइल बनाएँ ~/.vim/<file>.vim

<file.vim>$VIMRUNTIME(उपनिर्देशिका सहित) के सापेक्ष पथ है । आपके उदाहरण में, यह होना चाहिए syntax/c.vim। इसे फ़ाइल के बजाय लोड किया जाएगा $VIMRUNTIME

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

मैं अक्सर इसे वाक्यविन्यास फ़ाइलों के साथ प्रयोग करने के लिए एक प्रारंभिक बिंदु के रूप में उपयोग करता हूं , और फिर बाद में नीचे दिए गए तरीकों में से एक का उपयोग करके स्थानीय परिवर्तन के लिए अपने स्थानीय परिवर्तन निकालता हूं।

स्थानीय जोड़

वाक्यविन्यास फ़ाइलों में स्थानीय जोड़ जोड़ने के दो तरीके हैं, वे कार्यात्मक रूप से समान हैं, और आप अपनी पसंद की विधि का उपयोग कर सकते हैं।

Syntax autocmd

Syntaxऑटोकैड का उपयोग करें :

augroup ft_c
    autocmd!
    autocmd Syntax c syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
    autocmd Syntax c syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
    autocmd Syntax c hi cFunction gui=NONE guifg=#B5A1FF
augroup end

ध्यान दें कि कई कमांड के साथ |यहाँ समस्याग्रस्त है, क्योंकि वे :synकमांड के हिस्से के रूप में व्याख्या करने के लिए जाते हैं , यही वजह है कि मैंने autocmd Syntax cकई बार दोहराया है । एक फ़ंक्शन का उपयोग करने के लिए एक विकल्प होगा:

fun s:c()
    syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
    syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
    hi cFunction gui=NONE guifg=#B5A1FF
endfun

augroup ft_c
  autocmd!
  autocmd Syntax c call s:c()
augroup end

लाभ यह है कि सभी परिवर्तन एक फ़ाइल में समाहित किए जा सकते हैं। नुकसान यह है कि यह थोड़ा बदसूरत है, खासकर यदि आपके पास बहुत सारे बदलाव हैं।

निर्देशिका के बाद

बाद निर्देशिका का उपयोग करें ~/.vim/after/<file>.vim:।

इसके बाद लोड <file>.vimकिया जाएगा, जहां (उपनिर्देशिका सहित) के <file.vim>सापेक्ष पथ है $VIMRUNTIME। आपके उदाहरण में, यह होना चाहिए syntax/c.vim

यह भी देखें :help after-directory

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

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