2011-11-09 12 views
13

सी ++ 11 लैम्ब्डा फ़ंक्शंस के साथ विम का उपयोग करना वास्तव में खराब है। इंडेंटेशन काम नहीं कर रहा है और बहुत सारे ब्रैकेट गलत के रूप में चिह्नित हैं।विम और सी ++ 11 लैम्ब्डा: ऑटो इंडेंटेशन

जैसा कि मुझे पता है कि सी और सी ++ के लिए इंडेंट और सिंटैक्स हाइलाइटिंग आंतरिक रूप से प्रोग्राम किया गया है और सी [...] vim फ़ाइल के माध्यम से नहीं है। क्या सी ++ 11 के लिए विम सेट अप करने का कोई मौका है, खासकर लैम्ब्डा फ़ंक्शंस के साथ स्रोत कोड के लिए? शायद कोई संकेत दे सकता है कि आंतरिक विम सिंटैक्स जांच में लैम्ब्डा पार्सिंग कैसे और कहाँ जोड़ना है?

संपादित करें: (टिप्पणियों से अनुरोध के रूप में उदाहरण कोड)

कोड निम्न उदाहरण की तरह दिखना चाहिए, लेकिन एक एकल स्तंभ के लिए स्वरूपित है।

MyLoop([](int a, int b){ 
     {  
      ::i++; 
      for (;;) 
      { 
       SomeFunc(); 
      } 
      cout << "Result: " << a*b<<endl; 
     }  
    });  

अद्यतन vim 7.4 के लिए: अब vim अब एक लैम्ब्डा अभिव्यक्ति एक त्रुटि के रूप में संभाल नहीं किया था, लेकिन यह अभी भी लैम्ब्डा अभिव्यक्ति में किसी भी खरोज नहीं किया और इसलिए यह अभी भी अब और ग के लिए उपयोगी नहीं है ++: - (

Btw: है किसी को भी एक अच्छा ऑटो प्रारूपण टूल जो vim पर्यावरण के लिए जोड़ा जा सकता है, कि एक कुंजी दबाने बाह्य स्वरूपण ऐसा

+1

http://stackoverflow.com/questions/2977174/is-there-a-c0x-syntax-file-for-vim – u0b34a0f6ae

+0

क्या आप इस बात का एक उदाहरण जोड़ सकते हैं कि यह कैसे इंडेंट कर रहा है और आप इसे कैसे इंडेंट करना चाहते हैं? – Alex

उत्तर

11

विम 7.4 में अब jN "इंडेंट जावा अज्ञात वर्ग सही ढंग से" के लिए cinoption है। (:help java-cinoptions) यह सी ++ 11 के लैम्बडास के लिए इंडेंटिंग व्यवहार में सुधार करता है।

इन विकल्पों के साथ

(अपने ~/.vim/के बाद/ftplugin/cpp.vim में डाल):

setlocal cindent cino=j1,(0,ws,Ws 

और अगर मैं एक ही पंक्ति के लिए लूप के उद्घाटन ब्रेस के लिए अपने लिए कदम (अन्यथा यह पागल है) फिर vim इस तरह आपका कोड इंडेंट करता है:

MyLoop([](int a, int b){ 
    {  
     ::i++; 
     for (;;) { 
      SomeFunc(); 
     } 
     cout << "Result: " << a*b<<endl; 
    }  
}); 

यह आपको लटकाने वाले इंडेंट को नहीं देता है जिसे आप चाहते हैं। यदि आप शुरुआती उद्घाटन को अपनी लाइन पर ले जाते हैं, तो आपको वांछित लटकते इंडेंट मिलते हैं।

सभी विकल्पों के लिए, :help cinoptions-values देखें।


आप बेहतर तरीके से खिसकने कार्यक्रम में चाहते हैं, this user recommendsset equalprg=clang-format उपयोग करने के लिए ClangFormat तो =ip वर्तमान अनुच्छेद इंडेंट होगा। जब आप टाइप करते हैं तो इससे विम सही तरीके से इंडेंट नहीं बन जाएगा (आपको इसके लिए इंडेंटएक्सप्रैप सेट करने की आवश्यकता है और यह काफी जटिल है)।

a vim plugin भी है जो समानांतर सेटिंग के समान ही लगता है, लेकिन अधिक कोड के साथ। सुनिश्चित नहीं है कि यह बेहतर है या नहीं। यह clang-format.py (साइप्रियन ग्वेरा के उत्तर से) का विकल्प माना जाता है।

+0

अच्छा। अगर आप ~/.vim/after/ftplugin/cpp.vim फ़ाइल नहीं बनाना चाहते हैं, तो आप निम्न पंक्ति में भी .vimrc जोड़ सकते हैं: 'autocmd BufEnter * .cpp: setlocal cindent cino = j1, (0, ws, Ws' – jmmk

1

उपयोग

:let c_no_curly_error = 1 
?

उदाहरण के लिए आप इसे अपने vimrc में डाल सकते हैं।

आपकी धारणा के लिए, यह गलत है। c.vim सिंटैक्स फ़ाइल (विम रनटाइम में) है। आप :help c.vim में एक संदर्भ देख सकते हैं और इसे अपने vim रनटाइम पथ (:echo &rtp) में देखकर कार्यान्वयन देख सकते हैं।

+0

यह समाधान गलत रखा गया ब्रेसिज़ से अंक हटाता है, जो मुझे पसंद नहीं है। इंडेंटेशन अभी भी गलत है। – Klaus

+1

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

1

माइकल स्मॉल द्वारा this प्रोजेक्ट है। मैंने अभी तक यह कोशिश नहीं की है, लेकिन शायद यही वह है जिसे आप ढूंढ रहे हैं।

+1

इन नई सिंटैक्स फ़ाइलों को स्थापित करने के साथ मुझे अब कोई ग़लत ब्रेसिज़ नहीं मिला है, लेकिन इंडेंटेशन अभी भी लैम्बडास के लिए गलत है। – Klaus

0

सेट smartindent autoindent

तो फिर तुम vim के कोड से ऊपर टाइप करें, आप सही खरोज मिल जाएगा।

लेकिन, यदि आप कोड ऊपर gg = जी या आदेशों को शामिल "=" को फिर से मांगपत्र का उपयोग करें, खरोज अभी भी गलत है।

+0

जीजी = जी सुविधा का महत्वपूर्ण हिस्सा है :-) और लाल चिह्नित ब्रेसिज़ भी बहुत सुंदर नहीं हैं। ठीक है, जैसा ऊपर बताया गया है, मैं गलत ब्रेसिज़ के लिए सभी चेतावनियों को दबा सकता हूं, लेकिन यह भी सहायक नहीं है। मैं वास्तव में सोच रहा हूं कि क्यों कोई भी विम के लिए सही इंडेंट फ़ाइल को लागू नहीं करता है। मैं वास्तव में केवल बाहरी स्वरूपण चलाता हूं जो वास्तव में बेवकूफ है! क्या पुराना विम है या सी ++ 11 अक्सर उपयोग नहीं किया जाता है? समस्या के ठीक होने के बिना अब 2 साल हैं ... बीटीडब्लू: प्रारंभिक सूचियां भी विम के साथ टूटी हुई हैं :-( – Klaus

0

क्या आप के लिए देख लग रहे LLVM लोगों से clang-format.py या vim-clang-format Linda_pp उर्फ ​​rhysd (उत्तरार्द्ध के लिए धन्यवाद idbrii) से है - दोनों clang का उपयोग इसलिए दोनों सी ++ 11 नई संरचनाओं का समर्थन है और आप इसे चला सकते हैं इस प्रकार है:

:pyf ~/src/llvm.git/tools/clang/tools/clang-format/clang-format.py 

या : ClangFormat

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

+1

[vim-clang-format] (https://github.com/rhysd/vim-clang-format) [clang-format.py] (http://clang.llvm.org/docs/ClangFormat.html#vim-integration) के लिए बेहतर विकल्प होने का दावा करता है। सुनिश्चित नहीं है कि या तो बराबर से बेहतर हैं। – idbrii

+0

क्लैंग-प्रारूप परिवर्तन इंडेंटिंग से संबंधित स्वरूपण का एक टन, जो हमेशा वांछनीय नहीं होता है। – pavon

0

मैंने कुछ दिनों के लिए इसके साथ संघर्ष किया, ऐसा लगता है कि सिंडेंट सक्षम के साथ स्मार्टइंडेंट पर टॉगलिंग करने से मुझे सी ++ 11 में लैम्ब्डा इंडेंटेशन में मदद मिली।

आपके ~/में।vimrc

set cindent 
set smartindent 

उम्मीद है कि यह peeps बाहर मदद करता है।

+0

मुझे कोई बदलाव नहीं दिखता है। लैम्ब्डा अभिव्यक्ति के अंदर सभी इंडेंटेशन अभी भी टूटे हुए हैं। सभी ब्रेसिज़ को एक कॉलम में स्थानांतरित किया जाता है। क्या आप दिखा सकते हैं कि इंडेंटेशन आपके सेटअप के साथ कैसा दिखता है – Klaus

संबंधित मुद्दे