จะเรียก clang-format ผ่านโฟลเดอร์ cpp project ได้อย่างไร


89

มีวิธีเรียกสิ่งที่ต้องการclang-format --style=Webkitสำหรับโฟลเดอร์โครงการ cpp ทั้งหมดแทนที่จะเรียกใช้แยกกันสำหรับแต่ละไฟล์หรือไม่?

ฉันกำลังใช้clang-format.pyและvimทำสิ่งนี้ แต่ฉันคิดว่ามีวิธีการใช้ครั้งเดียว

คำตอบ:


49

สิ่งที่เกี่ยวกับ:

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

ในโฟลเดอร์โครงการ อ็อพชัน -i ทำให้มันถูกแทนที่ (โดยค่าเริ่มต้นเอาต์พุตที่จัดรูปแบบจะถูกเขียนลงใน stdout)


1
หรือหากคุณใช้ไฟล์กำหนดค่าและต้องการจัดรูปแบบไฟล์หลายประเภท: clang-format-3.6 -i -style=file *.cpp *.h *.hpp
mBardos

46
น่าเสียดายที่จะไม่สร้างซ้ำในไดเรกทอรีย่อย
Antimony

4
ใช่ * .cpp จะถูกขยายโดยเชลล์ เสียงดังแค่ต้องการรายชื่อไฟล์ ตัวเลือกขั้นสูงเพิ่มเติม (เช่นการปัดซ้ำ) ขึ้นอยู่กับคุณสมบัติของเชลล์ของคุณ ดูunix.stackexchange.com/questions/49913/recursive-globเกี่ยวกับวิธีใช้**โครงสร้าง
sbarzowski

เกี่ยวกับclang-tidyอะไร?
Aaron Franke

@AaronFranke การใช้*.cppเพื่อสร้างรายการไฟล์ควรใช้งานได้ clang-tidyคำสั่งช่วยให้ผ่านหลายไฟล์ `USAGE: clang-tidy [options] <source0> [... <sourceN>]` ในทางปฏิบัติอาจไม่ใช่วิธีที่ดีที่สุด Clang-tidy ทำการวิเคราะห์ที่ลึกกว่ามากดังนั้นจึงต้องใช้แฟล็กคอมไพเลอร์สำหรับแต่ละไฟล์เป็นต้นเมื่อฉันใช้ clang-tidy ฉันมักจะมี "ฐานข้อมูลการคอมไพล์" ซึ่งเป็นไฟล์ JSON ที่มีคำสั่งสำหรับแต่ละไฟล์และสคริปต์บางตัว มากกว่านั้น เมื่อสองสามปีก่อนอาจจะมีวิธีที่ดีกว่านี้ก็ได้
sbarzowski

90

น่าเสียดายที่ไม่มีวิธีใช้รูปแบบเสียงดังซ้ำ *.cppจะจับคู่เฉพาะไฟล์ในไดเร็กทอรีปัจจุบันไม่ใช่ไดเร็กทอรีย่อย แม้**/*จะไม่ทำงาน

โชคดีที่มีวิธีแก้ปัญหาคือคว้าชื่อไฟล์ทั้งหมดด้วยfindคำสั่งและไพพ์เข้ามาตัวอย่างเช่นหากคุณต้องการจัดรูปแบบทั้งหมด.hและ.cppไฟล์ในไดเร็กทอรีfoo/bar/แบบวนซ้ำคุณสามารถทำได้

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

ดูที่นี่สำหรับการสนทนาเพิ่มเติม


7
ดี**/*.cppดูเหมือนว่าจะทำงานใน (ปัจจุบันพอสมควร) ทุบตี คุณอาจต้องทำshopt -s globstarก่อน
sbarzowski

1
หากคุณกำลังใช้ CMake, โพสต์นี้แสดงให้เห็นว่าคุณสามารถใช้ CMake ของGLOB_RECURSEเพื่อค้นหาทุกไฟล์และผ่านไปยัง.cpp clang-format
ต้นอินทผลัม

5
การรวมfindและxargsควรใช้find ... -print0และxargs -0 ...เพื่อให้แน่ใจว่าชื่อไฟล์ทุกประเภทได้รับการจัดการอย่างถูกต้อง
Alexander

5
คำสั่งนี้จะล้มเหลวหากมีไฟล์. cpp หรือ. h ใน pwd find foo/bar/ -iname '*.h' -o -iname '*.cpp' | xargs clang-format -iจะแก้ไขปัญหา
nyanpasu64

29

ขั้นแรกให้สร้าง.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แล้วมันไม่ได้ผล
Aaron Franke

ไม่ใช่ว่าฉันรู้นอกเหนือจากการเปลี่ยนไดเร็กทอรีปัจจุบัน
Alexander

วิธีแก้ปัญหาสลัมที่ฉันคิดขึ้นมาคือการสร้างฟังก์ชันที่เรียกใช้ก่อนcp ~/.clang-format .จากนั้นคำสั่ง find ในคำตอบของคุณ
Aaron Franke

12

ฉันเพิ่งพบ bash-script ซึ่งทำสิ่งที่คุณต้องการ:

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

นี่คือสคริปต์ทุบตีที่จะทำงานclang-format -iกับโค้ดของคุณ

คุณสมบัติ:

  • ค้นหาเส้นทางที่ถูกต้องclang-formatบน Ubuntu / Debian ซึ่งเข้ารหัสเวอร์ชัน LLVM ในclang-formatชื่อไฟล์
  • แก้ไขไฟล์แบบวนซ้ำ
  • ตรวจพบนามสกุลไฟล์ทั่วไปที่ใช้โดยโปรเจ็กต์ C / C ++

ใน Windows ฉันใช้มันสำเร็จแล้วใน Git Bash และ WSL


3

สำหรับผู้ใช้ Windows: หากคุณรองรับ Powershell 3.0 คุณสามารถทำได้:

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

หมายเหตุ 1: ใช้pushd .และpopdถ้าคุณต้องการมีไดเร็กทอรีปัจจุบันเดียวกันก่อนและหลังสคริปต์

หมายเหตุ 2: สคริปต์ทำงานในไดเร็กทอรีการทำงานปัจจุบัน

Note3: สิ่งนี้อาจเขียนเป็นบรรทัดเดียวได้หากสิ่งนั้นสำคัญสำหรับคุณจริงๆ


0

ฉันใช้คำสั่งต่อไปนี้เพื่อจัดรูปแบบไฟล์วัตถุประสงค์ -C ทั้งหมดภายใต้โฟลเดอร์ปัจจุบันแบบวนซ้ำ :

$ 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

นี่คือโซลูชันที่ค้นหาแบบวนซ้ำและไพพ์ไฟล์ทั้งหมดไปยังรูปแบบเสียงดังเป็นรายการไฟล์ในคำสั่งเดียว นอกจากนี้ยังไม่รวมไดเร็กทอรี "build" (ฉันใช้ CMake) แต่คุณสามารถข้ามขั้นตอน "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มีข้อมูลการจัดรูปแบบ


ฉันไม่คิดว่า globstar เปิดอยู่โดยค่าเริ่มต้นใน bash ดังนั้นคุณต้องตั้งค่า
Eric Backus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.