2015-11-11 15 views
32

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

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

से पहले:

#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 से कम वर्ण।

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

+0

अपने विशेष उदाहरण के लिए, 'AllowShortFunctionsOnASingleLine सेट करें: कोई भी' काम नहीं करेगा। – dejvuth

+0

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

+0

मुझे आश्चर्य है कि विभिन्न "जुर्माना" विकल्पों में बदलाव करने में मदद मिलेगी, लेकिन वे सभी तोड़ने वाली लाइनों से जुड़ी जुर्माना लगती हैं, न कि उन्हें "बेबुनियाद"। – zmb

उत्तर

22

तो, बजना प्रारूप कोड में चारों ओर गड़बड़ और कुछ पैच बना रहा है, यहाँ मेरी दो सेंट है:

  • बजना प्रारूप पर आधारित है,

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

    इसे मूल व्हाइटस्पेस का सम्मान करना आसान नहीं है, जब आप पहले कोड को पार्स करते हैं तो उस तरह का फेंक दिया जाता है।

  • जहां यह पंक्ति विराम देता है, सबसे आसानी से

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

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

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 पूरे कोड बेस पर एक समान प्रारूप को लागू करने के बारे में बहुत कुछ है, यह सुनिश्चित कर लें कि सभी स्ट्रिंग अक्षर आपके प्रोग्राम में हर जगह एक ही शैली में स्वरूपित हों। यदि आप लाइन-ब्रेक फैसलों पर माइक्रो-स्तरीय नियंत्रण रखना चाहते हैं, तो यह वास्तव में टूल की भावना में नहीं है, और आपको इसे अक्षम करने जैसी चीजें करना होगा।

यह कभी-कभी निराशाजनक esp हो सकता है।

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}, 
}; 

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

या, अगर आपके पास ओपन साथ प्रयोग के लिए 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 }; 

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

+0

ग्रेट उत्तर पर होता है। आपका सुझाव '// clang-format off' से थोड़ा बेहतर लगता है, और यह बताता है कि यह इस तरह से क्यों व्यवहार करता है, यह बहुत समझ में आता है। – zmb

+0

कॉलमलिमिट 0 अभी भी लाइन ब्रेक को संरक्षित करता है। यह कैसे समझाओ? – KindDragon

6

मुझे वर्तमान में documentation में कुछ भी नहीं देखा गया जो आपको ऐसा करने की अनुमति देगा।

कॉलमलिमिट को 0 पर सेट करना अभी भी टेक्स्ट रैपिंग को संरक्षित करेगा।

clang-format-mp-3.4 test.c -style="{ ColumnLimit: 0 }"

#include <vector> 
#include <memory> 
#include <string> 

int main() { 
    std::vector<std::string> vec = { 
    "this is a test", 
    "with some strings", 
    "that I want on separate lines" 
    }; 
} 
+1

वह' कॉलमलिमिट 'को 120 तक सेट करना चाहता है? – Danh

+1

दाएं। यह मेरी रैपिंग को बरकरार रखता है लेकिन बहुत लंबी लाइनों को ठीक करने के लिए कुछ भी नहीं करता है (जो टूल का एक बड़ा फायदा है, आईएमओ)। – zmb

+0

यह एक समझौता है, लेकिन मेरे लिए कोई ब्रेनर नहीं है। मुझे प्रोग्राम्स 100 मैन्युअल रूप से लपेटने में प्रसन्नता हो रही है, अगर क्लैंग-प्रारूप मेरी सरणी परिभाषाओं में नई लाइनों के साथ उलझन में नहीं आता है, तो मेरे अधिक जटिल 'std :: cout' अभिव्यक्तियों में, मेरी' enum', मेरी पैरामीटर सूचियां, ... – Gauthier

9

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

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

+0

मैं यह नहीं कह रहा कि यह एक बुरा जवाब है लेकिन समस्या का एक बिल्कुल भयानक समाधान क्या है। स्वत: स्वरूपण कार्य करने के लिए टिप्पणियों के साथ अपने कोड को अव्यवस्थित करें। – Martin

+0

शायद, लेकिन व्यावहारिक रूप से मैंने इसे शायद ही कभी उपयोग किया है जहां मैं स्वरूपण नियम तोड़ना चाहता हूं। मैं आमतौर पर इस तरह से बाहर निकलने की सराहना करता हूं, और 'कोड को अव्यवस्थित' करके दुर्व्यवहार करने की सराहना नहीं करता हूं। उपकरण का प्रयोग अक्सर बुरी तरह उपयोगकर्ता – MattG

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