सी ++ मोड, अभद्र भ्रम

Aug 16 2020

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

float GetE0()
{
    // Calculate E0 according to Kurfess et. al, 2000
    arma::fvec
        E2 {vertex2X - vertex1X, vertex2Y - vertex1Y, vertex2Z - vertex1Z}, E3 {vertex3X - vertex2X, vertex3Y - vertex2Y, vertex3Z - vertex2Z};
    
    float cosPhi2 = norm_dot(E2,E3);
    
    return Kurfess_Eq5(cosPhi2);
}

अब, मुझे लंबे समय तक इनिशियलाइज़ेशन E2और E3कष्टप्रद लगता है, इसलिए मैं बेहतर पठनीयता के लिए दोनों के बीच एक लाइन ब्रेक बनाता हूं। मैं अपने पूरे बफर को भी इंडेंट करता हूं।

float GetE0()
{
    // Calculate E0 according to Kurfess et. al, 2000
    arma::fvec
        E2 {vertex2X - vertex1X, vertex2Y - vertex1Y, vertex2Z - vertex1Z},
        E3 {vertex3X - vertex2X, vertex3Y - vertex2Y, vertex3Z - vertex2Z};

        float cosPhi2 = norm_dot(E2,E3);

        return Kurfess_Eq5(cosPhi2);
}

अब, Emacs फ्लोट [...] का संकेत देता है और उसी कॉलम में स्टेटमेंट लौटाता है E2, जैसे E3। पहले उदाहरण में ऐसा नहीं था। मेरे आम आदमी के दिमाग में आखिरी दो बयान उसी कॉलम के हैं arma::fvec, जैसे वह पहले उदाहरण में था।

क्या इसे ठीक करने का कोई तरीका है?

मुझे अभी तक इंटरनेट में कुछ खास नहीं मिला। आमतौर पर, मैं सी-स्टाइल 'स्ट्रॉस्ट्रुप' का उपयोग कर रहा हूं। मैंने अन्य शैलियों की कोशिश की, जिनमें कोई भी सक्सेस नहीं थी।

संपादित करें: क्षमा करें, मैं पूरी तरह से भूल गया। मैं 25.2.2 emacs का उपयोग कर रहा हूं, मैं पतवार का उपयोग करता हूं, और एक कंपनी क्लेंग के साथ पूरा करता हूं लेकिन कोई पैकेज नहीं है जो मैं इंडेंटेशन को संशोधित करने के बारे में सोच सकता हूं।

Edit2: मैंने -Q विकल्प (emacs -Q) के साथ भी ऐसा ही व्यवहार किया है, इसलिए मुझे लगता है कि मैं इस बात से इंकार कर सकता हूं कि मेरे पैकेज कार्य का कारण हैं।

Edit3: Emacs को इंस्टॉल करना 27.1 ने समस्या को ठीक कर दिया, लेकिन इसने मुझे हाइलाइटिंग और इंडेंटेशन से संबंधित एक अनुवर्ती प्रश्न के लिए प्रेरित किया।

उदाहरण 3: अब, इंडेंटेशन सही प्रतीत हो रहा है, लेकिन हाइलाइटिंग बंद है (यह पहले था, लेकिन इंडेंटेशन मुद्दा प्राथमिकता था)।

float GetE0()
{
    // Calculate E0 according to Kurfess et. al, 2000
    arma::fvec
        E2 {vertex2X - vertex1X, vertex2Y - vertex1Y, vertex2Z - vertex1Z},
        E3 {vertex3X - vertex2X, vertex3Y - vertex2Y, vertex3Z - vertex2Z};

    float cosPhi2 = norm_dot(E2,E3);
    return Kurfess_Eq5(cosPhi2);
}

उपरोक्त उदाहरण में, Emacs E2एक चर के रूप में हाइलाइट करता है लेकिन E3मानक पाठ रंग है। जब मैंने अब उदाहरण 4 में इंडेंटेशन को बदल दिया:

float GetE0()
{
    // Calculate E0 according to Kurfess et. al, 2000
    arma::fvec

         E2 {vertex2X - vertex1X,
         vertex2Y - vertex1Y,
         vertex2Z - vertex1Z},

         E3 {vertex3X - vertex2X,
             vertex3Y - vertex2Y,
             vertex3Z - vertex2Z};

    float cosPhi2 = norm_dot(E2,E3);
    return Kurfess_Eq5(cosPhi2);
}

आप देख सकते हैं, कि इंडेंटेशन से E2अलग है E3। मेरा मानना ​​है कि अलग-अलग इंडेंटेशन E3एक चर के रूप में नहीं पहचानने वाले emacs का परिणाम है । क्या किसी ने इसका अवलोकन भी किया?

यहाँ चित्रण के लिए एक स्क्रीनशॉट

जवाब

Andi Aug 31 2020 at 01:08

ठीक है, इसलिए मैं सीसी-मोड के अनुरक्षकों / डेवलपर्स के संपर्क में आया और यह पता चला कि यह बग है। उन्होंने इसका भी ख्याल रखा:https://sourceforge.net/p/cc-mode/mailman/message/37097087/

पत्राचार में आपको टेक्स्ट फॉर्म में एक पैच मिलता है। पैच को लागू करने के लिए, टेक्स्ट को किसी फ़ाइल जैसे कि patchfile.txt पर कॉपी करें

$ mv patchfile.txt path/to/emacs/share/../lisp/progmodes $ cd path/to/emacs/share/../lisp/progmodes

यदि आपके पास केवल cc - *। El.gz और .elc है लेकिन कोई cc- .el फ़ाइलें प्रोगमोड्स फ़ोल्डर में नहीं है, तो आपको पहले उन्हें निकालना होगा

$ gunzip cc-*.el

पैच लगाने से पहले, जांच लें कि क्या कोई त्रुटि होगी

$ patch --dry-run < patchfile.txt

यदि आउटपुट इसके जैसा दिखता है:

Hunk #1 succeeded at 9091 (offset -22 lines).
Hunk #2 succeeded at 9144 (offset -22 lines).
Hunk #3 succeeded at 11731 (offset -29 lines).
checking file cc-langs.el
Hunk #1 succeeded at 3684 (offset -9 lines).

अब आप पैच लागू कर सकते हैं

$ patch < patchfile.txt
[same output as dry-run]

पैचिंग करते समय, .orig फ़ाइलों को बैकअप के रूप में बनाया जाता है, अगर आपको कभी भी वापस जाने की आवश्यकता होती है।

अंतिम चरण के रूप में, आपको .el-to-files को .elc में संकलित करना होगा

$ emacs -Q -batch -f batch-byte-compile cc-*.el

मेरा आउटपुट:

Source file ‘/opt/emacs/emacs-27.1-install/share/emacs/27.1/lisp/progmodes/cc-langs.el’ newer than byte-compiled file; using older file

In end of data:
cc-styles.el:687:1:Warning: the function ‘c-guess-basic-syntax’ might not be
    defined at runtime.

अब Emacs को रीस्टार्ट करें।

आउटपुट के कारण ([...] बाइट संकलित [...] से नया है। मुझे cc-mode, टाइप में emacs में एक बफर खोलने के लिए कहा गया था

M-: c-recognize-bare-brace-inits
<Return>

यदि प्रतिध्वनि क्षेत्र "t" प्रदर्शित करता है तो सब कुछ ठीक होना चाहिए। यदि नहीं, तो आप बैकअप का उपयोग करने और प्रारंभिक स्थिति में लौटने पर विचार कर सकते हैं।

बहरहाल, मेरे मामले में बग को इस तरह से हल किया गया था। मैं कल्पना कर सकता था कि जब तक फिक्स को आधिकारिक तौर पर सोर्सफोर्ज पर नहीं लाया जाएगा तब तक यह फिक्स-डिस्क्रिप्शन को अप्रचलित कर देगा।