cppプロジェクトフォルダでclang-formatを呼び出す方法は?


89

clang-format --style=Webkitファイルごとに個別に実行するのではなく、cppプロジェクトフォルダー全体のようなものを呼び出す方法はありますか?

私はこれを使用clang-format.pyvimて実行していますが、これを一度適用する方法があると思います。

回答:


49

どうですか:

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

プロジェクトフォルダ内。-iオプションを使用すると、インプレースになります(デフォルトでは、フォーマットされた出力はstdoutに書き込まれます)。


1
または、構成ファイルを使用していて、複数のファイルタイプをフォーマットする場合: clang-format-3.6 -i -style=file *.cpp *.h *.hpp
mBardos 2015

46
残念ながら、それはサブディレクトリに再発しません。
アンチモン2016年

4
はい、*。cppはシェルによって展開されます。clangにはファイルのリストが必要です。より高度なオプション(再帰的グロブなど)は、シェルの機能によって異なります。構成の使用方法については、unix.stackexchange.com / questions / 49913 / recursive-globを参照してください**
sbarzowski 2016年

どうclang-tidyですか?
アーロンフランケ

@AaronFrankeを使用*.cppしてファイルのリストを生成すると機能するはずです。このclang-tidyコマンドを使用すると、複数のファイルを渡すことができます。`使用法:clang-tidy [options] <source0> [... <sourceN>]`実際には、これは最善の方法ではないかもしれません。Clang-tidyはより詳細な分析を実行するため、各ファイルなどのコンパイラフラグが必要です。clang-tidyを使用したとき、通常は「コンパイルデータベース」がありました。これは、各ファイルのコマンドと実行されたスクリプトを含むJSONファイルです。その上。それは数年前のことでしたが、今はもっと良い方法があるかもしれません。
sbarzowski

90

残念ながら、clang形式を再帰的に適用する方法はありません。*.cppサブディレクトリではなく、現在のディレクトリ内のファイルにのみ一致します。でも**/*動作しません。

幸いにも、解決策があります:グラブを持つすべてのファイル名find。コマンドパイプそれらでは、すべてのフォーマットしたい場合たとえば、.hおよび.cppディレクトリ内のファイルをfoo/bar/再帰的に、あなたが行うことができます

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

詳細については、こちらをご覧ください。


7
まあ、**/*.cpp(かなり現代的な)bashで動作するようです。あなたはshopt -s globstar前にする必要があるかもしれません。
sbarzowski 2016年

1
CMakeを使用している場合、この投稿では、CMakeを使用GLOB_RECURSEしてすべての.cppファイルを検索し、それらをに渡す方法を示しますclang-format
フェニックス

5
との組み合わせはfind、およびxargsを使用find ... -print0xargs -0 ...て、すべてのタイプのファイル名が正しく処理されるようにする必要があります。
アレクサンダー

5
pwdに.cppまたは.hファイルが存在する場合、このコマンドは失敗します。find foo/bar/ -iname '*.h' -o -iname '*.cpp' | xargs clang-format -i問題を修正します。
nyanpasu64 2018年

29

.clang-formatファイルが存在しない場合は、最初にファイルを作成します。

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

事前定義されたスタイルを選択するか、結果の.clang-formatファイルを編集します。

clang-formatconfiguratorが役立ちます。

次に、以下を実行します。

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

その他のファイルの拡張子よりcpphppcccxxだけでそれらを分離することを確認し、正規表現で使用することができます\|


以下のために-style=fileカスタムファイルパスを指定する方法はありますか?試しましたが-style=~/.clang-format、うまくいきません。
アーロンフランケ

現在のディレクトリを変更することを除けば、私が知っていることではありません。
アレクサンダー

私が思いついたゲットーの解決策は、最初に実行されcp ~/.clang-format .、次に検索コマンドを実行する関数を作成することです。
アーロンフランケ

12

最近、必要なことを正確に実行するbashスクリプトを見つけました。

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

これは、clang-format -iコードで実行されるbashスクリプトです。

特徴:

  • clang-formatLLVMバージョンをclang-formatファイル名でエンコードするUbuntu / Debianでの正しいパスを見つけます
  • ファイルを再帰的に修正します
  • C / C ++プロジェクトで使用される最も一般的なファイル拡張子を検出します

Windowsでは、GitBashとWSLで正常に使用しました。


3

Windowsユーザーの場合:Powershell 3.0をサポートしている場合は、次のことができます。

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

注1:使用pushd .してpopd、スクリプトの前と後に同じカレントディレクトリを持つようにしたい場合

注2:スクリプトは現在の作業ディレクトリで動作します

注3:それがあなたにとって本当に重要であるならば、これはおそらく一行で書くことができます


0

次のコマンドを使用して、現在のフォルダーの下にあるすべてのObjective-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

これは、再帰的に検索し、すべてのファイルを1つのコマンドでファイルリストとしてclang形式にパイプするソリューションです。また、「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

最新のbashでは、ファイルツリーを再帰的にクロールできます

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でデフォルトでオンになっているとは思わないので、設定する必要があります。
EricBackus20年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.