새 줄에 함수, 조건문 및 루프의 괄호 형식을 지정하도록 VIM에 지시하는 방법은 무엇입니까?

새 줄에 함수, 조건문 및 루프의 괄호 형식을 지정하도록 VIM에 지시하는 방법은 무엇입니까?

vim에게 새 줄에 대괄호 형식을 지정하도록 지시할 수 있는 방법이 있나요?

예를 들어:

public class Foo {
    private Foo(int a) {
        if (a > 30) {
            // do stuff
        }
        for (int i = 0; i < a; i++) {
            // more stuff
        }
    }
}

다음과 같아야 합니다.

public class Foo
{
    private Foo(int a)
    {
        if (a > 30)
        {
            // do stuff
        }
        for (int i = 0; i < a; i++)
        {
            // more stuff
        }
    }
}

왜 이런가요? VIM을 눌러 zc두 번째 예와 같이 형식이 지정되면 코드 블록을 멋지게 접을 수 있기 때문입니다. 이 경우 VIM은 괄호 안의 내용만 접습니다. 코드가 첫 번째 예와 같이 형식화되면 VIM은 괄호 안의 내용뿐만 아니라 , if (...), for (....), function f()등도 class Foo()접습니다. 그래서 VIM에게 두 번째 예와 같이 파일 형식을 지정하도록 지시하는 방법이 있는지 알고 싶습니다.

또 다른 대안은 VIM에게 대괄호 앞의 내용을 접지 않도록 지시하는 것입니다.

답변1

네, 아주 쉽게 할 수 있습니다. 줄 끝에 있는 기존 '{' 문자( $)를 캐리지 리턴( \r)과 새 '{'로 대체하고 형식을 적절하게 지정하려면 다음 두 명령을 수행할 수 있습니다. 극단적인 경우에 대한 답변 끝의 편집 내용을 참조하세요.)

:%s/{$/\r{

:%norm ==

첫 번째 명령은 다음과 같습니다.

public class Foo 
{
    private Foo(int a) 
{
        if (a > 30) 
{
            // do stuff
        }
        for (int i = 0; i < a; i++) 
{
            // more stuff
        }
    }
}

두 번째 명령은 다음과 같습니다.

public class Foo 
{
    private Foo(int a) 
    {
        if (a > 30) 
        {
            // do stuff
        }
        for (int i = 0; i < a; i++) 
        {
            // more stuff
        }
    }
}

( %위 명령의 기호는 파일의 모든 줄에 적용된다는 의미입니다. 대신 과 같은 범위를 지정하거나 :5,10s/{$/\r{과 같은 상대 줄 번호를 사용하거나 -2,+3s/{$/\r{, 시각적 모드에서 줄을 선택하고 누르면 : 대체 명령이 해당 줄에 적용됩니다. 윤곽).

=ap(문자 형식을 지정하기 위해 형식을 적용할 수도 있습니다 a p. 자세한 내용은 참조 :help =)

편집하다

@blackyellow의 의견에서: 좋은 해결책이지만 한 가지 문제는 이미 형식이 올바른 '}' 줄을 대체한다는 것입니다. 더 나은 패턴은 입니다 :%s/[^( |\t)]}$/\r{. '}' 앞에 두 개의 공백이나 탭이 있으면 행 끝을 '}'로 바꾸지 않습니다. 이는 아마도 올바르게 들여쓰기되었음을 나타냅니다.

관련 정보