vim에서 C 코드를 자동 서식 / 들여 쓰기는 어떻게합니까?


250

다른 파일에서 코드를 복사하면 다음과 같이 서식이 엉망이됩니다.

fun()
{
for(...)
{
for(...)
{
if(...)
{
}
}
}
}

vim에서이 코드를 자동 포맷하려면 어떻게해야합니까?


3
코드를 들여 쓰지 않고 형식을 지정하려는 사람은 두 번째 답변 (광산)이이를 해결합니다. 들여 쓰기 만 수정하려는 경우 허용되는 답변이 가장 간단한 방법입니다.
Derek

답변:


566

다음 키 입력을 시도하십시오.

gg=G

설명 : gg파일 맨 위로 이동 =하고 들여 쓰기를 수정하는 명령 G이며 파일 끝까지 조작을 수행하도록 지시합니다.


28
이것은 코드를 들여 쓰기 만합니다. 전체를 AUTOFORMAT하기 위해 수행 할 수없는 작업이 있습니까?
N 1.1

7
차이점은 무엇입니까?
Ton van den Heuvel

3
@ 톤 반 : 차이점에 대한 내 대답참조하십시오 (주석에서 여기에 설명하지 못했습니다).
Lazer

2
-1 이것은 형식화가 아닌 들여 쓰기 만 수정합니다 (요청한 것).
oligofren

3
@oligofren OP의 예에는 들여 쓰기 오류 만 포함되어 있었고 그는 대답을 받아들이므로 그 의미가 맞는 것 같습니다.
Amir Rachum

78

나는 예술적 스타일의 프로그램을 사용하고 싶습니다. 그들의 웹 사이트 에 따르면 :

Artistic Style은 C, C ++, C # 및 Java 프로그래밍 언어를위한 소스 코드 인 덴터, 포맷터 및 뷰티입니다.

Window, Linux 및 Mac에서 실행됩니다. 들여 쓰기, 탭을 공백으로 교체 또는 그 반대로, 원하는 작업 주위에 공백을 넣거나 (원하는 if(x<2)경우 변환 ( x<2 )) 함수 정의와 같은 줄에 중괄호를 넣거나 모든 옵션은 명령 행 매개 변수에 의해 제어됩니다.

vim에서 사용하려면 formatprg 옵션을 설정 한 다음 gq 명령을 사용하십시오. 예를 들어 .vimrc에 있습니다.

autocmd BufNewFile,BufRead *.cpp set formatprg=astyle\ -T4pb

.cpp 파일을 열 때마다 formatprg가 내가 좋아하는 옵션으로 설정됩니다. 그런 다음 gg를 입력하여 파일 맨 위로 이동하고 gqG표준에 따라 전체 파일을 포맷 할 수 있습니다. 단일 함수 만 다시 포맷해야하는 경우 함수 상단으로 이동 한 다음 입력 gq][하면 해당 함수 만 다시 포맷됩니다.

내가 원하는 스타일 옵션은 내가 -T4pb선호하는 것입니다. 문서를 살펴보고 원하는 대로 코드를 형식화하도록 옵션을 변경할 수 있습니다.

여기 데모가 있습니다. 스타일을 짓기 전에 :

int main(){if(x<2){x=3;}}

float test()
{
if(x<2)
x=3;
}

스타일 후 (gggqG) :

int main()
{
    if (x < 2)
    {
        x = 3;
    }
}

float test()
{
    if (x < 2)
        x = 3;
}

희망이 도움이됩니다.


3
다른 형식의 경우 이와 같은 것이 있습니까? 루비, xml, json 등?
derGral

1
@Ryan check vim-autoformat은 아래 답변을 참조하십시오. BTW vim-autoformat은 또한 스타일을 사용합니다.
Chiel ten Brinke

1
감사합니다! 함수 선언과 같은 줄에 여는 괄호를 원하지 않는 유일한 사람이라고 생각하기 시작했습니다!
user3640967

27

코드를 올바르게 들여 쓰기위한 내장 명령은 이미 언급되어 있습니다 ( gg=G). 코드 를 아름답게 하려면 indent 와 같은 외부 응용 프로그램을 사용해야합니다 . 이후 %전 모드에서 현재 파일이고, 당신은 다음과 같이 사용할 수 있습니다 :

:!indent %


11

나는 그것이 clang-format잘 작동 한다는 것을 알았 습니다.

clang 문서 에는 예제 키 바인딩이 있습니다.

equalprgvim 에서 바인딩 을 사용하는 것을 선호합니다 . 이것은 당신이 호출 할 수 clang-format와 함께 G=gg또는 다른 =들여 쓰기 옵션을 설정합니다.

.vimrc 파일에 다음을 입력하십시오.

autocmd FileType c,cpp setlocal equalprg=clang-format

3
먼저 설치해야합니다. 예 : 우분투 16.04+ :sudo apt install clang-format
Eric Wang

3

아마도 다음을 시도해 볼 수 있습니다 $ indent -kr -i8 * .c

그것이 당신에게 유용하기를 바랍니다!


3

indent위에서 언급 한 것처럼 좋아 하지만 가장 자주 작업중 인 파일의 작은 섹션 만 포맷하려고합니다. indentstdin에서 코드를 가져올 수 있으므로 매우 간단합니다.

  1. 형식을 지정할 코드 블록 등을 선택하십시오 V.
  2. 을 입력하여 형식을 지정하십시오 :!indent.

astyle stdin도 필요하므로 동일한 트릭을 사용할 수 있습니다.


2

:set paste붙여 넣기 전에 입력 할 수있는 첫 번째 위치에서 엉망이되는 것을 방지하기 위해 추가하고 싶었습니다 . 붙여 넣은 후 :set nopastejs-beautify 및 들여 쓰기와 같은 것을 다시 입력 하여 입력 할 수 있습니다 .


1
내가 사용 :set paste!을 설정하는 대신 붙여 넣기 값을 전환하는이를 위해. 이를 통해 간단히 몇 가지 명령을 뒤로 스크롤하고 Enter 키를 누를 수 있으므로 더 쉽게 끌 수 있습니다.
a'r

0

그것들은라는 도구 indent입니다. 로 다운로드 apt-get install indent한 다음를 실행할 수 있습니다 indent my_program.c.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.