Bir cpp proje klasörü üzerinden clang-format nasıl çağırılır?


89

Böyle bir şeyi çağırmanın bir yolu var mı clang-format --style=WebkitHer dosya için ayrı ayrı çalıştırmak yerine bütün bir cpp proje klasörü bir ?

Bunu kullanıyorum clang-format.pyve vimyapıyorum, ancak bunu bir kez uygulamanın bir yolu olduğunu varsayıyorum.

Yanıtlar:


49

Ne dersin:

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

proje klasöründe. -İ seçeneği onu yerinde yapar (varsayılan olarak biçimlendirilmiş çıktı stdout'a yazılır).


1
veya bir yapılandırma dosyası kullanıyorsanız ve birden çok dosya türünü biçimlendirmek istiyorsanız: clang-format-3.6 -i -style=file *.cpp *.h *.hpp
mBardos

46
Maalesef bu, alt dizinlere yansımaz.
Antimon

4
Evet, * .cpp kabuk tarafından genişletilecektir. clang sadece bir dosya listesine ihtiyaç duyar. Daha gelişmiş seçenekler (yinelemeli globbing gibi), kabuğunuzun özelliklerine bağlıdır. Yapının nasıl kullanılacağını öğrenmek için unix.stackexchange.com/questions/49913/recursive-glob sayfasına bakın **.
sbarzowski

Ne olacak clang-tidy?
Aaron Franke

@AaronFranke Kullanılması *.cppgereken dosyaların bir listesini oluşturmak için. clang-tidyKomut birden fazla dosya geçirerek verir. `KULLANIM: clang-tidy [seçenekler] <source0> [... <sourceN>]` `Pratikte bu en iyi yol olmayabilir. Clang-tidy çok daha derin bir analiz gerçekleştirir, bu nedenle her dosya için derleyici bayrakları gerektirir. Clang-tidy kullandığımda, genellikle bir "derleme veritabanı" vardı - her dosya için komutları içeren bir JSON dosyası ve giden bazı komut dosyası bitir. Birkaç yıl önceydi, belki şimdi daha iyi bir yolu vardır.
sbarzowski

90

Ne yazık ki, clang-formatını yinelemeli olarak uygulamanın bir yolu yoktur. *.cppalt dizinler ile değil, yalnızca geçerli dizindeki dosyalarla eşleşir. Hatta **/*çalışmıyor.

Neyse ki, bir çözüm var: findkomutla tüm dosya adlarını alın ve bunları yönlendirin. Örneğin , dizindeki tüm dosyaları .hve .cppdosyaları foo/bar/yinelemeli olarak biçimlendirmek istiyorsanız , şunları yapabilirsiniz:

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

Ek tartışma için buraya bakın .


7
Eh, **/*.cpp(makul modern) bash çalışmaları gibi görünüyor. Daha shopt -s globstarönce ihtiyacınız olabilir .
sbarzowski

1
CMake kullanıyorsanız, bu gönderi , GLOB_RECURSEtüm .cppdosyaları bulmak ve onlara aktarmak için CMake'leri nasıl kullanabileceğinizi gösterir clang-format.
phoenix

5
Kombinasyonu findve xargskullanmalıdır find ... -print0ve xargs -0 ...dosya adları her türlü doğru şekilde işlenmesini sağlamak için.
Alexander

5
Pwd'de herhangi bir .cpp veya .h dosyası varsa bu komut başarısız olur. find foo/bar/ -iname '*.h' -o -iname '*.cpp' | xargs clang-format -isorunu çözecek.
nyanpasu64

29

Öncelikle .clang-formatmevcut değilse bir dosya oluşturun :

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

İstediğiniz önceden tanımlanmış stili seçin veya elde edilen .clang-formatdosyayı düzenleyin .

clang biçimli yapılandırıcı faydalıdır.

O zaman koş:

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

Dışında dosya uzantıları cpp, hpp, ccve cxxnormal ifadede kullanılabilir sadece emin bunları ayırmak için yapmak \|.


İçin -style=fileözel bir dosya yolu belirtmek için bir yol var? Denedim -style=~/.clang-formatve işe yaramıyor.
Aaron Franke

Mevcut dizini değiştirmek dışında, bildiğimden değil.
Alexander

Bulduğum getto çözümü cp ~/.clang-format ., önce cevabınızda bul komutunu çalıştıran bir fonksiyon yapmak .
Aaron Franke

12

Geçenlerde tam olarak ihtiyacınız olanı yapan bir bash betiği buldum:

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

Bu, çalışacak bir bash betiğidir clang-format -i kodunuz üzerinde .

Özellikleri:

  • Doğru yolu bulur clang-formatclang-formatDosya adındaki LLVM sürümünü kodlayan Ubuntu / Debian'da
  • Dosyaları yinelemeli olarak düzeltir
  • C / C ++ projeleri tarafından kullanılan en yaygın dosya uzantılarını algılar

Windows'ta, Git Bash ve WSL'de başarıyla kullandım.


3

Windows kullanıcıları için: Powershell 3.0 desteğine sahipseniz şunları yapabilirsiniz:

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

Not 1: Koddan önce ve sonra aynı geçerli dizine sahip olmak istiyorsanız pushd .ve kullanınpopd

Not2: Komut dosyası mevcut çalışma dizininde çalışır

Not 3: Sizin için gerçekten önemliyse, muhtemelen tek bir satıra yazılabilir.


0

Geçerli klasör altındaki tüm amaç-C dosyalarını özyinelemeli olarak biçimlendirmek için aşağıdaki komutu kullanıyorum :

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

.bash_profileİşleri kolaylaştırmak için uygulamamda aşağıdaki takma adı tanımladım :

# 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

İşte özyinelemeli olarak arama yapan ve tüm dosyaları tek bir komutta bir dosya listesi olarak clang-formatına yönlendiren bir çözüm. Ayrıca "build" dizinini de hariç tutar (CMake kullanıyorum), ancak bunu kaldırmak için "grep" adımını atlayabilirsiniz.

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

0

Modern bash'ta dosya ağacını yinelemeli olarak tarayabilirsiniz

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

Burada kaynak bulunması varsayılır ./srcve .clang-formatbiçimlendirme bilgilerini içerir.


Bash'de globstar'ın varsayılan olarak açık olduğunu sanmıyorum, bu yüzden onu ayarlamanız gerekir.
Eric Backus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.