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.