cpp 프로젝트 폴더를 통해 clang-format을 호출하는 방법은 무엇입니까?


87

clang-format --style=Webkit각 파일에 대해 개별적으로 실행하는 대신 전체 cpp 프로젝트 폴더에 대해 호출하는 방법이 있습니까?

나는 이것을 사용 clang-format.py하고 vim있지만 이것을 한 번 적용하는 방법이 있다고 가정합니다.

답변:


46

는 어때:

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

프로젝트 폴더에 있습니다. -i 옵션은 그것을 제자리에 만듭니다 (기본적으로 형식화 된 출력은 stdout에 기록됩니다).


1
또는 구성 파일을 사용 clang-format-3.6 -i -style=file *.cpp *.h *.hpp
중이고

41
불행히도 하위 디렉토리로 재귀하지 않습니다.
Antimony

4
예, * .cpp는 쉘에 의해 확장됩니다. clang은 파일 목록 만 필요합니다. 재귀 적 globbing과 같은 고급 옵션은 셸의 기능에 따라 다릅니다. 구성 사용 방법에 대해서는 unix.stackexchange.com/questions/49913/recursive-glob 을 참조하십시오 **.
sbarzowski 2010 년

어때 clang-tidy?
Aaron Franke

@AaronFranke *.cpp파일 목록을 생성하는 데 사용할 수 있습니다. 이 clang-tidy명령을 사용하면 여러 파일을 전달할 수 있습니다. `사용법 : clang-tidy [옵션] <source0> [... <sourceN>]`실제로는 이것이 최선의 방법이 아닐 수도 있습니다. Clang-tidy는 훨씬 더 심층적 인 분석을 수행하므로 각 파일 등에 대한 컴파일러 플래그가 필요합니다. clang-tidy를 사용할 때 일반적으로 "컴파일 데이터베이스"가있었습니다. 각 파일에 대한 명령이있는 JSON 파일과 몇 가지 스크립트 그 위에. 몇 년 전이었는데 지금은 더 좋은 방법이있을 수 있습니다.
sbarzowski

85

불행히도 clang-format을 재귀 적으로 적용하는 방법은 없습니다. *.cpp하위 디렉터리가 아닌 현재 디렉터리의 파일 만 일치합니다. 심지어 **/*작동하지 않습니다.

다행히도 해결책이 있습니다. find명령으로 모든 파일 이름을 가져 와서 파이프합니다. 예를 들어 디렉토리의 모든 파일 .h.cpp파일을 foo/bar/재귀 적 으로 형식화 하려면 다음을 수행 할 수 있습니다.

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

추가 논의는 여기 를 참조 하십시오 .


6
글쎄, **/*.cpp(합리적으로 현대적인) bash에서 작동하는 것 같습니다. shopt -s globstar이전에 필요할 수도 있습니다 .
sbarzowski 2010 년

1
CMake를 사용하는 경우이 게시물 은 CMake를 사용하여 GLOB_RECURSE모든 .cpp파일 을 찾고 clang-format.
phoenix

4
의 조합 findxargs이용해야 find ... -print0하고 xargs -0 ...파일 이름의 모든 유형이 올바르게 처리되었는지 확인.
Alexander

3
이 명령은 pwd에 .cpp 또는 .h 파일이 있으면 실패합니다. find foo/bar/ -iname '*.h' -o -iname '*.cpp' | xargs clang-format -i문제를 해결할 것입니다.
nyanpasu64

26

.clang-format파일이없는 경우 먼저 파일을 만듭니다 .

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

원하는 미리 정의 된 스타일을 선택하거나 결과 .clang-format파일을 편집 합니다.

clang-format configurator 가 도움이됩니다.

그런 다음 다음을 실행하십시오.

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

이외의 파일 확장자 cpp, hpp, cccxx정규 표현식에서 사용할 수있는, 그냥 확인으로 구분 할 수 있도록 \|.


를 들어 -style=file사용자 정의 파일의 경로를 지정하는 방법은 무엇입니까? 나는 시도했지만 -style=~/.clang-format작동하지 않습니다.
Aaron Franke

현재 디렉토리를 변경하는 것 외에는 내가 알지 못합니다.
Alexander

내가 생각해 낸 빈민굴 솔루션은 먼저 실행되는 함수를 cp ~/.clang-format .만든 다음 답변에서 find 명령을 실행 하는 것입니다.
Aaron Franke

12

최근에 필요한 것을 정확히 수행하는 bash-script를 발견했습니다.

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

이것은 clang-format -i코드에서 실행되는 bash 스크립트입니다 .

풍모:

  • 파일 이름에 clang-formatLLVM 버전을 인코딩하는 Ubuntu / Debian 에서 올바른 경로를 찾습니다.clang-format
  • 재귀 적으로 파일 수정
  • C / C ++ 프로젝트에서 사용하는 가장 일반적인 파일 확장자를 감지합니다.

Windows에서는 Git Bash 및 WSL에서 성공적으로 사용했습니다.


3

Windows 사용자의 경우 : Powershell 3.0을 지원하는 경우 다음을 수행 할 수 있습니다.

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

참고 1 : 스크립트 전후에 동일한 현재 디렉토리를 사용하려면 pushd .and를 사용하십시오.popd

참고 2 : 스크립트는 현재 작업 디렉토리에서 작동합니다.

Note3 : 이것이 당신에게 정말로 중요하다면 아마 한 줄로 쓸 수 있습니다.


0

다음 명령을 사용하여 현재 폴더 아래의 모든 목표 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

다음은 반복적으로 검색하고 모든 파일을 하나의 명령으로 파일 목록으로 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.