c++ - क्लैंग-फॉर्मेट लाइन टूट जाती है




clang code-formatting (2)

मैं उपकरण को लाइन ब्रेक को हटाने से रोकने के लिए एक clang-format सेटिंग की तलाश कर रहा हूं।

उदाहरण के लिए, मेरे पास मेरा ColumnLimit सेट 120 है, और जब मैं कुछ नमूना कोड ColumnLimit हूं तो यहां क्या होता है।

पहले:

#include <vector>
#include <string>

std::vector<std::string> get_vec()
{
   return std::vector<std::string> {
      "this is a test",
      "some of the lines are longer",
      "than other, but I would like",
      "to keep them on separate lines"
   };
}

int main()
{
   auto vec = get_vec();
}

बाद:

#include <vector>
#include <string>

std::vector<std::string> get_vec()
{
   return std::vector<std::string>{"this is a test", "some of the lines are longer", "than other, but I would like",
         "to keep them on separate lines"};
}

int main()
{
   auto vec = get_vec();
}

मैं यह चाहूंगा कि उपकरण उन रेखाओं को तोड़ता है जो 120 से अधिक वर्ण हैं, लेकिन वे केवल रेखाओं को संयोजित करने का निर्णय नहीं लेते क्योंकि वे 120 वर्णों से कम हैं।

क्या ऐसा कोई विकल्प है? डॉक्स में कुछ भी मेरे लिए नहीं खड़ा था।


इसलिए, क्लैग फॉर्मेट कोड में गड़बड़ कर दी है और कुछ पैच बनाए हैं, यहाँ मेरे दो सेंट हैं:

  • क्लैंग प्रारूप पर आधारित है,

    • libclang का उपयोग करके एएसटी को पार्स करना, जो मूल रूप से सभी libclang समाप्त करता है
    • "अलिखित लाइनों" में टोकन अनुक्रम को तोड़ना जो "तार्किक" कोड लाइनों की तरह हैं
    • कभी-कभी नियमों / कॉन्फ़िगरेशन जानकारी को लागू करने से छोटी इकाइयों में "अलिखित लाइनें" विभाजित हो जाती हैं
    • नए व्हाट्सएप / इंडेंटेशन के साथ इसे फिर से वापस थूक दें

    जब आप पहली बार कोड को पार्स करते हैं, तो मूल श्वेतपत्र का सम्मान करना आसान नहीं होता है।

  • आप यह नियंत्रित कर सकते हैं कि यह कहां-कहां, कितनी आसानी से, लाइन ब्रेक लगाता है

    • कॉलम की सीमा निर्धारित करना
    • "बिन पैक मापदंडों" विकल्पों का उपयोग करना
    • विभिन्न प्रकार के विराम के लिए दंड निर्धारित करना - एक प्रकार के रिटर्न के बाद ब्रेक, पहले कॉल पैरामीटर से पहले ब्रेक, एक स्ट्रिंग शाब्दिक को तोड़ना, एक ब्रेक को तोड़ना ...
    • एक पंक्ति के अंत में टिप्पणियाँ रखना (क्लैंग प्रारूप टिप्पणी को हटा नहीं सकता है और इसलिए लाइन को विभाजित करना चाहिए)
    • निर्देश पर बंद / प्रारूप का उपयोग करें

यहाँ एक बात आप कोशिश कर सकते हैं:

std::vector<std::string> get_vec()
{
   return std::vector<std::string> {   //
      "this is a test",                //
      "some of the lines are longer",  //
      "than other, but I would like",  //
      "to keep them on separate lines" //
   };
}

इस ओवर // clang-format off का लाभ यह है कि, यदि आप बाद में टैब की चौड़ाई या किसी अन्य विकल्प को बदलते हैं, तो उन कोड लाइनों को अभी भी उन स्वरूपण में परिवर्तन मिलेंगे, इसलिए आपको मैन्युअल रूप से // clang-format off में जाने की आवश्यकता नहीं है इसे ठीक करने के लिए क्षेत्रों को // clang-format off । हालाँकि यह अभी भी एक हैक, YMMV है।

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

यह कभी-कभी निराशाजनक जासूसी हो सकता है। जब आप सरणियों के साथ काम करना चाहते हैं और कॉलम संरेखित या कुछ - उदाहरण के लिए, यहाँ लुआ सी एपीआई से कुछ प्राकृतिक कोड है:

static luaL_Reg const methods[] = {
    {"matches",               &dispatch::intf_match_unit},
    {"to_recall",             &dispatch::intf_put_recall_unit},
    {"to_map",                &dispatch::intf_put_unit},
    {"erase",                 &dispatch::intf_erase_unit},
    {"clone",                 intf_copy_unit},
    {"extract",               &dispatch::intf_extract_unit},
    {"advance",               intf_advance_unit},
};

जब क्लैंग-प्रारूप उस पर चलता है, तो यह आम तौर पर सही कॉलम को संरेखित नहीं करने वाला होता है, इसका कॉमा के बाद निश्चित संख्या में स्थान होता है और इसके बारे में बहुत कुछ नहीं किया जा सकता है।

या, यदि आपके पास OpenGL के साथ उपयोग के लिए 4 x 4 मैट्रिक्स है:

      constexpr float shadow_skew_hardcoded[16] =
        { 1.0f, 0.0f, 0.0f, 0.0f,
          0.5f, 0.5f, 0.0f, 0.0f,
          0.0f, 0.0f, 1.0f, 0.0f,
          0.0f, 0.0f, 0.0f, 1.0f };

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


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

std::vector<std::string> get_vec()
{
   // clang-format off
   return std::vector<std::string> {
      "this is a test",
      "some of the lines are longer",
      "than other, but I would like",
      "to keep them on separate lines"
   };
   // clang-format on
}

देखें: http://clang.llvm.org/docs/ClangFormatStyleOptions.html#disabling-formatting-on-a-piece-of-code





clang-format