จะปิดฟอร์แมตโค้ด Eclipse สำหรับบางส่วนของโค้ด Java ได้อย่างไร


488

ฉันมีโค้ด Java บางตัวที่มีคำสั่ง SQL เขียนเป็นสตริง Java (โปรดอย่า flamewars OR / M, SQL ฝังตัวคืออะไร - ไม่ใช่การตัดสินใจของฉัน)

ฉันใช้คำสั่ง SQL แบบ semantically เป็นสตริงที่ต่อกันหลายบรรทัดเพื่อให้ง่ายต่อการบำรุงรักษา ดังนั้นแทนที่จะชอบ:

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

เห็นได้ชัดว่าเป็นหนึ่งใน "การแก้ปัญหา" คือการมีสมาชิกในทีมของเราเป็นมาตรฐานในบางตัวจัดรูปแบบภายนอกเช่นJalopyหรือJIndentแต่นั่นไม่ใช่สิ่งที่คำถามนี้เป็นเรื่องเกี่ยวกับ (ยังไม่ได้ตัดสินใจของฉันในโครงการนี้): ฉันกำลังมองหาเฉพาะวิธีการ หลีกเลี่ยงการจัดรูปแบบ Eclipse บนพื้นฐานแบบเฉพาะกิจ

ตามหลักการแล้วโซลูชันจะอนุญาตให้ฉันแทรกคำแนะนำสำหรับการจัดรูปแบบ Eclipse โดยไม่ต้องการสมาชิกในทีมที่ใช้ Eclipse เพื่อทำการตั้งค่า IDE ใหม่ (นอกเหนือจากการเลือกคำสั่ง formatter agnostic comment: STOP-ECLIPSE-FORMATTINGSTOP-FORMATTING)


1
เราพบปัญหานี้แล้ว Eclipse ควรมีตัวเลือกให้แบ่งบรรทัดในตัวสร้างสตริงโดยที่เครื่องหมาย + คือไม่ว่าสตริงบิตถัดไปจะพอดีกับบรรทัดหรือไม่ แต่มันก็ไม่ได้ :-(
JeeBee

เห็นได้ชัดว่ามีการเพิ่มฟีเจอร์นี้ใน Eclipse 3.6M6: bugs.eclipse.org/bugs/show_bug.cgi?id=27079
Guillaume

หมายเหตุ: หากคุณต้องการป้องกันคราสไม่ให้แสดงความคิดเห็นของคุณคุณสามารถใช้ // ด้านหน้าของแต่ละบรรทัด หากต้องการคอมเม้นต์บล็อกให้ไฮไลต์และกด Ctrl + /
John Henckel

โปรดทราบว่าตอนนี้ 10 ปีต่อมา Java 14 อาจจะนำสายหลายสายทำให้เรื่องนี้ผ่านมา
Thorbjørn Ravn Andersen

คำตอบ:


865

Eclipse 3.6 ช่วยให้คุณสามารถปิดการจัดรูปแบบโดยการแสดงความคิดเห็นพิเศษเช่น

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

เปิด / ปิดคุณสมบัติจะต้องมีการเปิด "กับ" ในการตั้งค่า Java > Code Style > FormatterEclipse: คลิกที่Edit, เปิดใช้งานOff/On TagsEnable Off/On tags

นอกจากนี้ยังเป็นไปได้ที่จะเปลี่ยนสายเวทมนตร์ในการตั้งค่า - ตรวจสอบ Eclipse 3.6 เอกสารที่นี่

ข้อมูลมากกว่านี้

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

การตั้งค่านี้ช่วยให้คุณสามารถกำหนดหนึ่งแท็กเพื่อปิดการใช้งานและอีกหนึ่งแท็กเพื่อเปิดใช้งานตัวจัดรูปแบบ (ดูที่แท็บปิด / เปิดแท็กในโปรไฟล์ตัวจัดรูปแบบของคุณ):

ป้อนคำอธิบายรูปภาพที่นี่

คุณต้องเปิดใช้งานแฟล็กจาก Java Formatting


7
ตัวเลือก "ไม่รวมสาย" ที่กล่าวถึงที่อื่นในหน้านี้ก็มีประโยชน์เช่นกัน
xpmatteo

89
คุณสมบัติเปิด / ปิดจะต้องเปิด "เปิด" ในการกำหนดค่าตามความชอบ Eclipse: Java> สไตล์โค้ด> ตัวจัดรูปแบบ คลิกที่ปุ่ม "แก้ไข", "ปิด / เปิดแท็ก", ตรวจสอบ "เปิดใช้งานปิด / เปิดแท็ก"
Domenic D.

2
สิ่งนี้ไม่สามารถใช้ได้ในการตั้งค่าสไตล์รหัส JavaScriptซึ่งฉันมีปัญหาตรงข้ามกับการจัดรูปแบบ :(
Redsandro

11
ทีมควรส่งออกสำเนาของ Eclipse prefs (ไฟล์) ไปยังวิกิและต้องการให้ทุกคนใช้อันเดียวกัน ทำงานได้ดีสำหรับเรา ;)
Joseph Lust

FYI ฉันต้องลบช่องว่างระหว่างเครื่องหมาย // และเครื่องหมาย @ เพื่อให้ใช้งานได้
Roy Truelove

61

AFAIK จาก Eclipse 3.5 M4 บนตัวจัดรูปแบบมีตัวเลือก "ไม่เข้าร่วมสาย" ซึ่งจะรักษาเส้นแบ่งผู้ใช้ บางทีนั่นอาจเป็นสิ่งที่คุณต้องการ

มีแฮ็คที่น่าเกลียดนี้หรือไม่

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

1
ดังนั้นนอกเหนือไปจากการตั้งค่า "ไม่เคยเข้าร่วมกับสายตัวเลือก" ฉันยังต้องเขียนเหล่านี้ "ผี" แสดงความเห็น? ควรส่วน "ไม่เข้าร่วมเส้น" ไม่ควรทำงานด้วยตัวเอง?
Greg Mattes

2
ใช่แน่นอนมันควรจะเป็น ความคิดเห็นแฟนทอมเป็นวิธีการทางเลือก (ในกรณีที่ไม่มีอยู่หรือคุณติดอยู่กับเวอร์ชันก่อนหน้า ฯลฯ )
Chris

ฉันใช้วิธีนี้ควบคู่ไปกับเทมเพลตการจัดรูปแบบที่กำหนดเองใน TOAD เพื่อให้ฉันสามารถดึง SQL เก่าออกจากรหัส JAVA ทำการฟอร์แมตใหม่และรับความคิดเห็นที่ไม่เกี่ยวข้องทั้งหมดแล้วส่งกลับไปยัง JAVA มันเจ็บปวด แต่ก็อนุญาตให้เราจัดรูปแบบอัตโนมัติในการบันทึกโค้ด Java ตอนนี้ ขอบคุณสำหรับคำแนะนำ!
jnt30

โดยไม่ต้องตรวจสอบ "ไม่ต้องเข้าร่วมสาย" มาโครเปิด / ปิดไม่ทำงานสำหรับฉัน - ขอบคุณ!
Christoffer Soop

28

ดูคำตอบเกี่ยวกับเรื่องนี้ดังนั้น

มีวิธีแก้ไขปัญหาอื่นที่คุณสามารถใช้เพื่อระงับการจัดรูปแบบของข้อคิดเห็นบล็อกเฉพาะ ใช้/*-(หมายเหตุยัติภังค์) ที่จุดเริ่มต้นของความคิดเห็นบล็อกและการจัดรูปแบบจะไม่ได้รับผลกระทบหากคุณจัดรูปแบบส่วนที่เหลือของไฟล์

/*-
 * 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

แทนที่จะปิดการจัดรูปแบบคุณสามารถกำหนดค่าให้ไม่เข้าร่วมบรรทัดที่ล้อมรอบแล้ว คล้ายกับการตอบสนองของ Jitter ต่อไปนี้เป็น Eclipse STS:

คุณสมบัติ→สไตล์รหัส Java →ฟอร์แมตเตอร์→เปิดใช้งานการตั้งค่าเฉพาะโครงการหรือกำหนดค่าการตั้งค่าพื้นที่ทำงาน→แก้ไข→การตัดบรรทัด (แท็บ) →ตรวจสอบ "ไม่เคยเข้าร่วมบรรทัดที่ถูกห่อแล้ว"

บันทึกใช้

ป้อนคำอธิบายรูปภาพที่นี่


1
ฉันคิดว่านี่จะช่วยอะไรก็ได้เช่นตัวอย่าง SQL แต่ฉันไม่แน่ใจว่ามันจะเพียงพอสำหรับกรณีทั่วไปที่ปิดใช้งานตัวจัดรูปแบบ IDE อย่างสมบูรณ์
Greg Mattes

2
วิธีแก้ปัญหานี้ยอดเยี่ยมเมื่อใช้รูปแบบตัวสร้างและความเกี่ยวข้องเพิ่มขึ้นอย่างแน่นอนเมื่อเปิดตัว lambdas ใน Java 8
Jonas 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

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 - Bugs: วิธีการจัดรูปแบบรหัสอัตโนมัติวิธีการหาข้อบกพร่อง? ความสอดคล้อง: ความสอดคล้องเป็นข้อโต้แย้งที่ดี แต่คุณภาพของรหัสโดยรวมนั้นสำคัญกว่า คุณสามารถกำหนดกระบวนการที่สอดคล้องกันที่ดีสำหรับการพลิกแฮมเบอร์เกอร์ แต่มันจะไม่ทำงานกับอาหารชั้นสูง การทำอาหาร a อาจเป็นกิจกรรมที่ซับซ้อนพอสมควรหรือไม่สำคัญถ้าคุณไม่สนใจข้อเท็จจริงที่เพียงพอ หากคุณคิดว่าการพัฒนาซอฟต์แวร์นั้นเป็นเหมือนเครื่องมือที่ใช้ในการสับเปลี่ยนความสม่ำเสมอของแฮมเบอร์เกอร์ นี่ไม่ใช่ข้อโต้แย้งเกี่ยวกับการจัดรูปแบบเส้นคู่มือ แต่ถ้านักพัฒนาไม่สนใจแนวทางเหล่านี้จะไม่สนใจสิ่งจำเป็นอื่น ๆ
โทมัสจอง

4
อาร์กิวเมนต์ของฉันที่นี่: ฉันเขียนรหัสที่ดีและฉันยึดติดกับเส้นคู่มือการจัดรูปแบบ แต่ฉันเป็นขี้เกียจ ทำไมฉันต้องแทรกจำนวนช่องว่างและตัวแบ่งบรรทัดที่ถูกต้องเมื่อฉันสามารถเขียนโค้ดเลอะเทอะห้าบรรทัดของฉันกดปุ่มฟอร์แมตแล้วมีความสุข หลังจากฉันจัดรูปแบบรหัสโดยใช้เครื่องมือของฉันที่ทำให้แน่ใจว่าผลลัพธ์จะสมบูรณ์แบบเสมอฉันเป็นนาซีเหมือนกับใคร ๆ เกี่ยวกับการจัดรูปแบบ ไม่มีข้อโต้แย้งใด ๆ กับการยึดติดกับเส้นนำ (อื่น ๆ ที่พวกเขาอาจจะไม่ดีโดยเฉพาะ) หากการจัดรูปแบบเป็นเพียง kestroke ไป สมาชิกโครงการทั้งหมดแชร์การตั้งค่าการจัดรูปแบบรหัสเดียวกัน
ต่อ Wiklander
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.