Java 코드의 특정 섹션에 대해 Eclipse 코드 포맷터를 끄는 방법은 무엇입니까?


488

Java 문자열로 작성된 SQL 문이있는 Java 코드가 있습니다 (OR / M 불꽃은 피하십시오. 내장 SQL은 내 결정이 아닙니다).

유지 관리를 쉽게하기 위해 SQL 문을 의미 적으로 여러 줄의 코드로 연결된 여러 문자열로 나누었습니다. 따라서 다음과 같은 대신 :

String query = "SELECT FOO, BAR, BAZ FROM ABC WHERE BAR > 4";

나는 다음과 같은 것을 가지고있다 :

String query =
    "SELECT FOO, BAR, BAZ" +
    "  FROM ABC          " +
    " WHERE BAR > 4      ";

이 스타일을 사용하면 특히 큰 쿼리의 경우 SQL을 훨씬 쉽게 읽고 유지 관리 할 수 ​​있습니다 (IMHO). 예를 들어, 편집기를 "덮어 쓰기"모드로 설정하고 텍스트를 제자리에서 상당히 쉽게 수정할 수 있습니다.

이 문제는 특정 SQL 예를 넘어 일반화됩니다. 세로 형식, 특히 표 형식으로 작성된 코드는 예쁜 프린터에 의해 손상 될 수 있습니다.

이제 일부 프로젝트 멤버는 Eclipse 편집기를 사용하고 전체 소스 파일을 형식화 할 때 시맨틱 형식이 종종 소멸됩니다.

형식화와 관련하여 Eclipse에 특정 소스 행을 무시하도록 지시하는 방법이 있습니까?

Eclipse 포맷터를 토글하는 특수 주석과 같은 것을 찾고 있습니다. 이상적으로 이러한 주석은 원하는대로 구성 할 수 있으며 다른 포매터도이를 존중하도록 프로그래밍 할 수 있습니다.

// STOP-ECLIPSE-FORMATTING
String query =
    "SELECT FOO, BAR, BAZ" +
    "  FROM ABC          " +
    " WHERE BAR > 4      ";
// START-ECLIPSE-FORMATTING

물론, 하나의 "솔루션은"우리 팀 구성원이 같은 일부 외부 포맷을 표준화하는 것입니다 고물 또는 JIndent ,하지만이 질문은 (또한이 프로젝트에 대한 나의 결정)에 대해 무엇 아니다 : 내가 특별히 방법을 찾고 있어요 임시로 Eclipse 포맷터를 사용하지 마십시오.

이상적으로 솔루션을 사용하면 Eclipse를 사용하여 팀 구성원이 IDE 재구성을 수행하지 않아도 Eclipse 포매터에 대한 지침을 삽입 할 수 있습니다 (포맷터 무의미한 명령 주석 선택 가능 : STOP-ECLIPSE-FORMATTINGSTOP-FORMATTING).


1
이 문제가 발생했습니다. Eclipse 다음 문자열 비트가 라인에 맞는지 여부에 관계없이 +가있는 String 생성자에서 항상 라인을 끊는 옵션 있어야합니다. 그러나 그렇지 않습니다. :-(
JeeBee 2016

분명히이 기능은 Eclipse 3.6M6에서 추가되었습니다 : bugs.eclipse.org/bugs/show_bug.cgi?id=27079

참고 : 단순히 일식이 주석을 엉망으로 만들지 못하게하려면 // 각 줄 앞에 //를 사용할 수 있습니다. 블록을 주석 처리하려면 강조 표시하고 Ctrl + /를 누릅니다.
John Henckel

이제 10 년 후, Java 14는 아마도 이것을 과거의 것으로 만드는 여러 줄 문자열을 가져올 것입니다.
Thorbjørn Ravn Andersen

답변:


865

Eclipse 3.6에서는 다음과 같은 특수 주석을 배치하여 형식화를 해제 할 수 있습니다.

// @formatter:off
...
// @formatter:on

Eclipse 환경 설정에서 켜기 / 끄기 기능을 "켜기"로 설정해야 Java > Code Style > Formatter합니다. 에 클릭 Edit, Off/On Tags활성화 Enable Off/On tags.

환경 설정에서 마술 문자열을 변경할 수도 있습니다 . 여기서 Eclipse 3.6 문서를 확인하십시오 .

추가 정보

Java > Code Style > Formatter > Edit > Off/On Tags

이 환경 설정을 사용하면 포맷터를 비활성화 할 태그 하나와 포맷터를 활성화 할 태그 하나를 정의 할 수 있습니다 (포맷터 프로파일의 Off / On Tags 탭 참조).

여기에 이미지 설명을 입력하십시오

또한 플래그를 활성화해야합니다 Java Formatting


7
이 페이지의 다른 곳에 언급 된 "절대 조인 안 함"옵션도 매우 유용합니다.
xpmatteo

89
켜기 / 끄기 기능을 "켜야"합니다. Eclipse 환경 설정에서 : Java> 코드 스타일> 포맷터. "Edit"버튼, "Off / On Tags"를 클릭하고 "Off / On tags 활성화"를 체크하십시오.
Domenic D.

2
JavaScript 코드 스타일 환경 설정 에서는 사용할 수 없으며 형식과 정확히 반대되는 문제 가 있습니다. :(
Redsandro

11
팀은 Eclipse 환경 설정 (파일) 사본을 위키로 내보내고 모든 사람이 동일한 사본을 사용해야합니다. 우리에게 잘 작동합니다. ;)
Joseph Lust

참고로 //와 @ 기호 사이의 공백을 제거 하여이 기능을 수행해야했습니다.
Roy Truelove

61

포맷터의 Eclipse 3.5 M4의 AFAIK에는 "줄 바꾸기 안 함"옵션이있어 사용자 줄 바꿈을 유지합니다. 어쩌면 그것은 당신이 원하는 것을 할 것입니다.

그렇지 않으면이 추악한 해킹이 있습니다.

String query = //
    "SELECT FOO, BAR, BAZ" + //
    "  FROM ABC"           + //
    " WHERE BAR > 4";

1
그래서 "라인에 참여하지 마십시오"옵션을 설정 이외에 나는 또한 이러한 "팬텀"코멘트를 작성해야? "Never Join Lines"파트 자체가 작동하지 않아야합니까?
Greg Mattes

2
물론입니다. 팬텀 주석은 다른 방법입니다 (존재하지 않거나 이전 버전이 붙어있는 경우 등).
Chris

나는이 접근법을 TOAD의 사용자 정의 형식 템플릿과 함께 사용하여 JAVA 코드에서 이전 SQL을 제거하고 다시 형식화하고 모든 불필요한 주석을 얻은 다음 JAVA에 다시 넣을 수있었습니다. 고통 스럽지만 지금 Java 코드를 저장할 때 자동 서식을 지정할 수 있습니다. 제안 해 주셔서 감사합니다!
jnt30

"Never join line"을 확인하지 않으면 on / off 매크로가 작동하지 않습니다. 감사합니다!
Christoffer Soop

28

SO에 대한이 답변을 참조하십시오 .

특정 블록 주석의 서식을 억제하는 데 사용할 수있는 또 다른 솔루션이 있습니다. 사용 /*-블록 주석의 시작에서 (하이픈 주), 당신은 파일의 나머지를 포맷하면 포맷이 영향을받지 않습니다.

/*-
 * Here is a block comment with some very special
 * formatting that I want indent(1) to ignore.
 *
 *    one
 *        two
 *            three
 */

출처 : Oracle의 설명서 .


2
이것은 사용자 IDE의 구성에 의존하지 않기 때문에 가장 좋은 대답입니다. 감사.
Azim

26

서식을 끄는 대신 이미 줄 바꿈 된 줄을 결합하지 않도록 구성 할 수 있습니다. 지터의 응답과 유사하게 다음은 Eclipse STS입니다.

속성 → Java 코드 스타일 → 포맷터 → 프로젝트 특정 설정 사용 또는 작업 공간 설정 구성 → 편집 → 줄 바꿈 (탭) → "이미 줄 바꿈 된 줄을 조인하지 마십시오"확인

저장하고 적용하십시오.

여기에 이미지 설명을 입력하십시오


1
나는 이것이 SQL 예제와 같은 것들에 도움이 될 것이라고 생각하지만 IDE 포맷터를 완전히 비활성화하는 일반적인 경우에는 충분하지 않다.
Greg Mattes

2
빌더 패턴을 사용하는 경우이 솔루션은 우수하고 관련성은 확실히 자바 8에 람다의 도입으로 증가
조나스 Kongslund

16

포맷터 태그를 추가하는 기능을 설정해야합니다. 메뉴 표시 줄에서 다음으로 이동하십시오.

Windows Preferences Java Code Style Formatter

언론 Edit버튼을 누릅니다. 마지막 탭을 선택하십시오. 켜기 / 끄기 상자를 확인하고 확인란을 사용하여 활성화하십시오.


14

줄의 시작 부분에 더하기 부호를 넣으면 형식이 다릅니다.

String query = 
    "SELECT FOO, BAR, BAZ" 
    +    "  FROM ABC"           
    +    " WHERE BAR > 4";

1
이것은 흥미로운 타협 일 수 있습니다. 일반적으로 한 도구의 바람직하지 않은 동작으로 인해 코드 형식을 너무 많이 변경하지 말고 싶습니다. 이 경우 문자열 연결 연산자는 SQL에서 발생하는 문제의 본질이 아니라 우연한 것입니다. 그렇기 때문에 각 줄의 끝에 작성하는 것을 선호합니다. 줄의 시작 부분으로 SQL을 강조해야한다고 생각합니다. 그러나 이것은 원하는 형식을 보존 할 수있는 솔루션이없는 경우에 좋은 방법 일 수 있습니다. 감사!
Greg Mattes

8
천만에요. 실제로, 나는 + 기호를 수십 년 동안 줄 앞에 놓고 포맷터를 속이지 않았습니다. 나는 그것이 앞에 나오는 것을 선호합니다. 왜냐하면 그것이 나에게 더 명확 해지기 때문입니다. 줄 끝에있는 것은 때때로 잃어 버립니다. 우리가 목공 컴파일러를 사용했을 때의 프로젝트 표준이었습니다.
CPerkins 2009

5

포맷터가 SQL 문자열 들여 쓰기를 엉망으로 만드는 것을 피하기 위해 고정 너비 문자열 부분 (공백으로 채워짐)을 사용하고 있습니다. 이것은 혼합 된 결과를 제공하며 SQL에서와 같이 공백이 무시되지 않지만 도움이 될 수있는 곳에서는 작동하지 않습니다.

    final String sql = "SELECT v.value FROM properties p               "
            + "JOIN property_values v ON p.property_id = v.property_id "
            + "WHERE p.product_id = ?                                  "
            + "AND v.value        IS NOT NULL                          ";

5

각 줄은 이중 슬래시 "//"로 끝납니다. 그것은 일식이 모두 같은 줄로 이동하는 것을 막을 것입니다.


4

다른 방법 : Eclipse 3.6의 "줄 줄 바꿈"과 "일반 설정"아래에 "이미 줄 바꿈 된 줄을 결합하지 마십시오"옵션이 있습니다. 이는 포맷터가 긴 줄을 줄 바꿈하지만 이미 줄 바꿈을 취소하지는 않습니다.


4

@xpmatteo는 코드의 일부를 비활성화하는 데 대한 답변을 제공하지만이 외에도 기본 Eclipse 설정은 전체 파일 대신 편집 된 코드 행만 형식화하도록 설정해야합니다.

Preferences->Java->Editor->Save Actions->Format Source Code->Format Edited Lines

동료가 실제로 변경하지 않은 코드를 다시 포맷하고 있기 때문에 처음부터 이런 일이 발생하지 않도록 막았을 것입니다. 소스 컨트롤에서 차이를 렌더링하는 실수를 방지하는 것이 좋습니다 (사소한 형식 설정 차이로 인해 전체 파일이 다시 포맷 될 때).

또한 태그 켜기 / 끄기 옵션이 꺼져 있으면 다시 포맷되지 않습니다.


2

//새로운 줄을 원하는 곳에 추가 하는 팬텀 코멘트 는 훌륭합니다!

  1. @formatter : off는 코드에서 편집기로 참조를 추가합니다. 내 생각에 코드에는 그러한 참조가 없어야합니다.

  2. 팬텀 주석 (//)은 사용 된 서식 도구에 관계없이 작동합니다. Eclipse 또는 InteliJ 또는 사용하는 편집기에 관계없이. 이것은 심지어 매우 멋진 Google Java 형식 과도 작동합니다.

  3. 팬텀 설명 (//)은 응용 프로그램 전체에서 작동합니다. Javascript가 있고 JSBeautifier 와 같은 것을 사용하는 경우 . Javascript에서도 유사한 코드 스타일을 가질 수 있습니다.

  4. 실제로 서식을 올바르게 설정 하시겠습니까? 혼합 탭 / 공간과 후행 공백을 제거하려고합니다. 코드 표준에 따라 줄을 들여 쓰려고합니다. 당신이 원하지 않는 것은 긴 줄입니다. 그것은 팬텀 의견이 당신에게주는 것입니다!


-3

이 핵은 작동합니다 :

String x = "s" + //Formatter Hack
    "a" + //
    "c" + //
    "d";

포맷터를 사용하지 않는 것이 좋습니다. 잘못된 코드는 인위적으로 좋지 않은 것처럼 보입니다. 좋은 코드는 시간이 걸립니다. 당신은 품질을 속일 수 없습니다. 포맷팅은 소스 코드 품질의 일부입니다.


8
포맷터를 사용하지 않는 것은 나쁜 생각입니다. 포맷터는 오류를 잡아 내고 코드를 일관된 상태로 유지합니다.
프랜시스 업튼 IV

흥미로운 제안이지만, 형식화가 어떻게 코드가 좋은지 아닌지 어떻게 알 수 있는지 모르겠습니다.
Chris

2
그가 말한 것은 잘못 작성되고 형식이 잘못된 코드는 "개선"하기 위해 형식화하기보다는 그대로 유지해야한다고 생각한다고 생각합니다. 잘못 작성되고 형식이 잘못된 코드는 쉽게 식별 할 수 있도록 "밀어 내"어야합니다. 나는 완전히 동의한다고 확신하지는 않지만 그 생각이라고 생각합니다.
Greg Mattes

1
@Francis-버그 : 자동 서식 코드는 어떻게 버그를 찾을 수 있습니까? 일관성 : 일관성은 좋은 주장이지만 전반적인 코드 품질이 더 중요합니다. 햄버거 뒤집기에 좋은 일관된 프로세스를 정의 할 수 있지만 고급 요리에는 적용되지 않습니다. 충분한 사실을 무시하면 요리는 상당히 복잡한 활동이 될 수 있습니다. 소프트웨어 개발이 햄버거 뒤집기 도구와 같다고 생각하면 일관성을 유지하는 도구가 적합합니다. 이것은 가이드 라인의 형식을 지정하는 것에 대한 논쟁이 아니지만 개발자가 이러한 지침에 관심이 없다면 다른 필수 사항에 신경 쓰지 않을 것입니다.
Thomas Jung

4
내 주장 : 나는 좋은 코드를 작성하고 서식 가이드 라인을 고수한다. 그러나 나는 LAZY입니다. 5 줄의 엉성한 코드를 쓸 수 있고 포맷 버튼을 눌러 행복하게하려면 왜 올바른 양의 공백과 줄 바꿈을 삽입해야합니까? 결과가 항상 완벽하다는 것을 보장하는 도구를 사용하여 코드를 포맷 한 후에는 포맷에 대해 다른 사람만큼 나치입니다. 서식이 단지 케 스트로크 거리이면 가이드 라인을 고수하는 것에 반대하는 주장은 없습니다 (다른 점은 특히 나쁠 수 있음). 모든 프로젝트 멤버는 동일한 코드 형식 설정을 공유합니다.
Per Wiklander
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.