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.

pengguna3639557
sumber

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).

sbarzowski
sumber
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.

Antimony
sumber
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 \|.

Alexander
sumber
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.

Julius Bullinger
sumber
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

Tim Meyer
sumber
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"
marcelosalloum.dll
sumber
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
Bim
sumber
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.

Mikhail
sumber
Saya rasa globstar tidak aktif secara default di bash, jadi Anda perlu menyetelnya.
Eric Backus