Bagaimana cara memanggil format-dentang melalui folder proyek cpp?


89

Apakah ada cara untuk memanggil sesuatu seperti clang-format --style=Webkituntuk seluruh folder proyek cpp, daripada menjalankannya secara terpisah untuk setiap file?

Saya menggunakan clang-format.pydan vimmelakukan ini, tetapi saya menganggap ada cara untuk menerapkan ini sekali.

Jawaban:


49

Bagaimana dengan:

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

di folder proyek. Opsi -i membuatnya di tempat (secara default keluaran yang diformat ditulis ke stdout).


1
atau jika Anda menggunakan file konfigurasi dan ingin memformat beberapa jenis file: clang-format-3.6 -i -style=file *.cpp *.h *.hpp
— mBardos

46
Sayangnya, ini tidak akan muncul kembali ke subdirektori.
— Antimony

4
Ya, * .cpp akan diperluas oleh shell. dentang hanya membutuhkan daftar file. Opsi lanjutan lainnya (seperti rekursif globbing) bergantung pada fitur shell Anda. Lihat unix.stackexchange.com/questions/49913/recursive-glob tentang cara menggunakan **konstruksi.
— sbarzowski

Bagaimana dengan clang-tidy?
— Aaron Franke

@AaronFranke Menggunakan *.cppuntuk menghasilkan daftar file harus bekerja. The clang-tidyperintah memungkinkan melewati beberapa file. `PENGGUNAAN: clang-tidy [options] <source0> [... <sourceN>]` Dalam praktiknya, itu mungkin bukan cara terbaik. Clang-tidy melakukan analisis yang jauh lebih dalam, sehingga memerlukan flag compiler untuk setiap file, dll. Saat saya menggunakan clang-tidy, saya biasanya memiliki "database kompilasi" - file JSON dengan perintah untuk setiap file dan beberapa skrip yang digunakan lebih dari itu. Beberapa tahun yang lalu, mungkin ada cara yang lebih baik sekarang.
— sbarzowski

90

Sayangnya, tidak ada cara untuk menerapkan format-clang secara rekursif. *.cpphanya akan mencocokkan file di direktori saat ini, bukan subdirektori. Bahkan **/*tidak berhasil.

Untungnya, ada solusi: ambil semua nama file dengan findperintah dan masukkan nama file tersebut . Misalnya, jika Anda ingin memformat semua .hdan .cppfile di direktori foo/bar/secara rekursif, Anda dapat melakukannya

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

Lihat di sini untuk diskusi tambahan.


7
Yah, **/*.cppsepertinya bekerja di pesta (yang cukup modern). Anda mungkin perlu shopt -s globstarsebelumnya.
— sbarzowski

1
Jika Anda menggunakan CMake, posting ini menunjukkan kepada Anda bagaimana Anda dapat menggunakan CMake GLOB_RECURSEuntuk menemukan semua .cppfile dan meneruskannya clang-format.
— phoenix

5
Kombinasi dari finddan xargsharus menggunakan find ... -print0dan xargs -0 ...untuk memastikan bahwa semua jenis nama file ditangani dengan benar.
— Alexander

5
Perintah ini gagal jika ada file .cpp atau .h di pwd. find foo/bar/ -iname '*.h' -o -iname '*.cpp' | xargs clang-format -iakan memperbaiki masalah tersebut.
— nyanpasu64

29

Pertama buat .clang-formatfile jika tidak ada:

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

Pilih gaya standar mana yang Anda suka, atau edit .clang-formatfile yang dihasilkan .

Clang-format configurator membantu.

Lalu lari:

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

Ekstensi file selain cpp, hpp, ccdan cxxdapat digunakan dalam ekspresi reguler, hanya pastikan untuk memisahkan mereka dengan \|.


Karena -style=fileadakah cara untuk menentukan jalur file kustom? Saya mencoba -style=~/.clang-formatdan tidak berhasil.
— Aaron Franke

Setahu saya tidak, selain mengubah direktori saat ini.
— Alexander

Solusi ghetto yang saya buat adalah membuat fungsi yang pertama kali berjalan cp ~/.clang-format .kemudian perintah find dalam jawaban Anda.
— Aaron Franke

12

Saya baru-baru ini menemukan skrip bash yang melakukan apa yang Anda butuhkan:

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

Ini adalah skrip bash yang akan dijalankan clang-format -ipada kode Anda.

Fitur:

  • Menemukan jalur yang benar ke clang-formatUbuntu / Debian, yang menyandikan versi LLVM di clang-formatnama file
  • Memperbaiki file secara rekursif
  • Mendeteksi ekstensi file paling umum yang digunakan oleh proyek C / C ++

Di Windows, saya berhasil menggunakannya di Git Bash dan WSL.


3

Untuk pengguna Windows: Jika Anda memiliki dukungan Powershell 3.0, Anda dapat melakukan:

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

Note1: Gunakan pushd .dan popdjika Anda ingin memiliki direktori saat ini yang sama sebelum dan sesudah skrip

Note2: Skrip beroperasi di direktori kerja saat ini

Note3: Ini mungkin dapat ditulis dalam satu baris jika itu benar-benar penting bagi Anda


0

Saya menggunakan perintah berikut untuk memformat semua file objektif-C di bawah folder saat ini secara rekursif :

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

Saya telah mendefinisikan alias berikut di my .bash_profileuntuk mempermudah:

# 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

Berikut adalah solusi yang mencari secara rekursif dan menyalurkan semua file ke format-clang sebagai daftar file dalam satu perintah. Ini juga mengecualikan direktori "build" (saya menggunakan CMake), tetapi Anda bisa menghilangkan langkah "grep" untuk menghapusnya.

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

0

Dalam bash modern, Anda dapat merayapi pohon file secara rekursif

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

Di sini sumber diasumsikan berada di ./srcdan .clang-formatberisi informasi pemformatan.


Saya rasa globstar tidak aktif secara default di bash, jadi Anda perlu menyetelnya.
— Eric Backus
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.