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{
. '}' 앞에 두 개의 공백이나 탭이 있으면 행 끝을 '}'로 바꾸지 않습니다. 이는 아마도 올바르게 들여쓰기되었음을 나타냅니다.