Cpp प्रोजेक्ट फ़ोल्डर पर क्लैंग-फॉर्मेट कैसे कॉल करें?


87

क्या clang-format --style=Webkitप्रत्येक फ़ाइल के लिए अलग से चलाने के बजाय संपूर्ण cpp प्रोजेक्ट फ़ोल्डर के लिए कॉल करने का एक तरीका है ?

मैं उपयोग कर रहा हूं clang-format.pyऔर vimयह करना है, लेकिन मुझे लगता है कि एक बार इसे लागू करने का एक तरीका है।

जवाबों:


46

व्हाट अबाउट:

clang-format -i -style=WebKit *.cpp *.h

परियोजना फ़ोल्डर में। -I विकल्प इसे बनाता है (डिफ़ॉल्ट रूप से स्वरूपित आउटपुट stdout को लिखा जाता है)।


1
या यदि आप एक विन्यास फाइल का उपयोग कर रहे हैं और कई फ़ाइल प्रकारों को प्रारूपित करना चाहते हैं: clang-format-3.6 -i -style=file *.cpp *.h *.hpp
mBardos

41
दुर्भाग्य से, यह उपनिर्देशिकाओं में नहीं आएगा।
एंटीमनी

4
हां, * .सीपी का विस्तार शेल द्वारा किया जाएगा। क्लैंग को बस फाइलों की सूची चाहिए। अधिक उन्नत विकल्प (जैसे पुनरावर्ती ग्लोबिंग) आपके शेल की सुविधाओं पर निर्भर करते हैं। निर्माण का उपयोग करने के बारे में unix.stackexchange.com/questions/49913/recursive-glob देखें **
sbarzowski

किस बारे में है clang-tidy?
एरॉन फ्रेंक

@AaronFranke *.cppफ़ाइलों की सूची तैयार करने के लिए काम करना चाहिए। clang-tidyआदेश एक से अधिक फ़ाइलों गुजर अनुमति देता है। `उपयोग: क्लैंग-सुथरा [विकल्प] <source0> [... <sourceN>]` व्यवहार में, हालांकि यह सबसे अच्छा तरीका नहीं हो सकता है। Clang-tidy एक बहुत गहरा विश्लेषण करता है, इसलिए इसे प्रत्येक फ़ाइल आदि के लिए संकलक झंडे की आवश्यकता होती है। जब मैंने clang-tidy का उपयोग किया, तो मेरे पास आमतौर पर एक "संकलन डेटाबेस" था - प्रत्येक फ़ाइल के लिए कमांड के साथ एक JSON फ़ाइल और कुछ स्क्रिप्ट जो गई थी इस पर। यह कुछ साल पहले था, शायद अब एक बेहतर तरीका है।
sbarzowski

85

दुर्भाग्य से, क्लैंग-प्रारूप को पुनरावर्ती रूप से लागू करने का कोई तरीका नहीं है। *.cppकेवल वर्तमान निर्देशिका में फ़ाइलों से मेल खाएगा, उपनिर्देशिकाओं से नहीं। यहां तक ​​कि **/*काम नहीं करता है।

सौभाग्य से, एक समाधान है: findकमांड के साथ सभी फ़ाइल नामों को पकड़ो और उन्हें पाइप करें। उदाहरण के लिए, यदि आप निर्देशिका में सभी फ़ाइलों .hऔर .cppफ़ाइलों को foo/bar/पुन: स्वरूपित करना चाहते हैं, तो आप कर सकते हैं

find foo/bar/ -iname *.h -o -iname *.cpp | xargs clang-format -i

अतिरिक्त चर्चा के लिए यहां देखें ।


6
ठीक है, **/*.cpp(यथोचित आधुनिक) बैश में काम करने लगता है। आपको shopt -s globstarपहले की आवश्यकता हो सकती है ।
sbarzowski

1
यदि आप CMake का उपयोग कर रहे हैं, तो यह पोस्ट आपको दिखाता है कि आप GLOB_RECURSEसभी .cppफ़ाइलों को खोजने और उन्हें पास करने के लिए CMake का उपयोग कैसे कर सकते हैं clang-format
फीनिक्स

4
के संयोजन findऔर xargsउपयोग करना चाहिए find ... -print0और xargs -0 ...यह सुनिश्चित करें कि फ़ाइल नाम के सभी प्रकार के सही ढंग से नियंत्रित किया जाता है।
अलेक्जेंडर

3
यदि pwd में कोई .cpp या .h फ़ाइलें मौजूद हैं, तो यह आदेश विफल हो जाता है। find foo/bar/ -iname '*.h' -o -iname '*.cpp' | xargs clang-format -iमुद्दे को ठीक कर देंगे।
nyanpasu64

26

.clang-formatयदि यह मौजूद नहीं है तो पहले एक फ़ाइल बनाएँ :

clang-format -style=WebKit -dump-config > .clang-format

आपको जो भी पूर्वनिर्धारित शैली पसंद हो, या परिणामी .clang-formatफाइल को संपादित करें ।

क्लैंग-प्रारूप विन्यासकर्ता सहायक है।

फिर भागो:

find . -regex '.*\.\(cpp\|hpp\|cc\|cxx\)' -exec clang-format -style=file -i {} \;

अन्य फ़ाइल एक्सटेंशन की तुलना cppमें hpp, ccऔर cxxनियमित अभिव्यक्ति में उपयोग किया जा सकता है, बस उन्हें अलग करना सुनिश्चित करें \|


के लिए -style=fileवहाँ एक कस्टम फ़ाइल पथ निर्दिष्ट करने के लिए एक तरीका है? मैंने कोशिश की -style=~/.clang-formatऔर यह काम नहीं करता है।
आरोन फ्रेंके

ऐसा नहीं है कि मुझे पता है, इसके अलावा वर्तमान निर्देशिका को बदलने से।
अलेक्जेंडर

मैं जिस घेटो समाधान के साथ आया था, वह एक समारोह बनाना है जो पहले चलता है और cp ~/.clang-format .फिर आपके उत्तर में कमांड को खोजता है।
आरोन फ्रेंके

12

मुझे हाल ही में एक बैश-स्क्रिप्ट मिली, जो वास्तव में आपकी ज़रूरत है:

https://github.com/eklitzke/clang-format-all

यह एक बैश स्क्रिप्ट है जो clang-format -iआपके कोड पर चलेगी ।

विशेषताएं:

  • clang-formatउबंटू / डेबियन पर सही रास्ता ढूंढता है , जो clang-formatफ़ाइल नाम में LLVM संस्करण को एन्कोड करता है
  • फ़ाइलों को पुनरावर्ती रूप से ठीक करता है
  • C / C ++ प्रोजेक्ट्स द्वारा उपयोग की जाने वाली सबसे सामान्य फ़ाइल एक्सटेंशन का पता लगाता है

विंडोज पर, मैंने इसे गिट बैश और डब्लूएसएल में सफलतापूर्वक उपयोग किया।


3

Windows उपयोगकर्ताओं के लिए: यदि आपके पास Powershell 3.0 का समर्थन है, तो आप कर सकते हैं:

Get-ChildItem -Path . -Directory -Recurse |
    foreach {
        cd $_.FullName
        &clang-format -i -style=WebKit *.cpp
    }

नोट 1: उपयोग करें pushd .और popdयदि आप स्क्रिप्ट से पहले और बाद में एक ही वर्तमान निर्देशिका चाहते हैं

नोट 2: स्क्रिप्ट वर्तमान कार्यशील निर्देशिका में चल रही है

नोट 3: यह शायद एक ही पंक्ति में लिखा जा सकता है यदि यह वास्तव में आपके लिए महत्वपूर्ण था


0

मैं वर्तमान फोल्डर के तहत सभी उद्देश्य-सी फ़ाइलों को पुनरावर्ती रूप से प्रारूपित करने के लिए निम्न कमांड का उपयोग कर रहा हूं :

$ find . -name "*.m" -o -name "*.h" | sed 's| |\\ |g' | xargs clang-format -i

मैंने .bash_profileचीजों को आसान बनाने के लिए अपने निम्नलिखित उपनामों को परिभाषित किया है:

# Format objC files (*.h and *.m) under the current folder, recursively
alias clang-format-all="find . -name \"*.m\" -o -name \"*.h\" | sed 's| |\\ |g' | xargs clang-format -i"

0

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

shopt -s globstar extglob failglob && ls **/*.@(h|hpp|hxx|c|cpp|cxx) | grep -v build | tr '\n' ' ' | xargs clang-format -i

0

आधुनिक बैश में आप फ़ाइल ट्री को पुन: क्रॉल कर सकते हैं

for file_name in ./src/**/*.{cpp,h,hpp}; do
    if [ -f "$file_name" ]; then
        printf '%s\n' "$file_name"
        clang-format -i $file_name
    fi
done

यहाँ स्रोत को स्थित माना जाता है ./srcऔर .clang-formatइसमें प्रारूपण की जानकारी होती है।

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