Làm cách nào để tắt trình định dạng mã Eclipse cho các phần nhất định của mã Java?


488

Tôi đã nhận được một số mã Java với các câu lệnh SQL được viết dưới dạng chuỗi Java (xin vui lòng không có flamewar OR / M, SQL được nhúng là gì - không phải là quyết định của tôi).

Tôi đã chia các câu lệnh SQL về mặt ngữ nghĩa thành một số chuỗi được nối với nhau qua một số dòng mã để dễ bảo trì. Vì vậy, thay vì một cái gì đó như:

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

Tôi có một cái gì đó như:

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

Kiểu này làm cho SQL dễ đọc và bảo trì hơn (IMHO), đặc biệt đối với các truy vấn lớn hơn. Ví dụ: tôi có thể đặt trình soạn thảo của mình vào chế độ "ghi đè" và sửa đổi văn bản tại chỗ khá dễ dàng.

Lưu ý rằng vấn đề này khái quát hóa ngoài ví dụ cụ thể của SQL. Bất kỳ mã nào được viết với bất kỳ định dạng dọc, đặc biệt là các cấu trúc bảng, đều dễ bị phá hủy bởi một máy in đẹp.

Bây giờ, một số thành viên dự án sử dụng trình soạn thảo Eclipse và định dạng ngữ nghĩa thường bị hủy khi họ định dạng toàn bộ tệp nguồn.

Có cách nào để hướng dẫn Eclipse bỏ qua các dòng nguồn nhất định liên quan đến định dạng không?

Tôi đang tìm kiếm một cái gì đó giống như một nhận xét đặc biệt để thay đổi định dạng Eclipse. Lý tưởng nhất, một nhận xét như vậy có thể được cấu hình để trở thành bất cứ điều gì chúng ta chọn và các trình định dạng khác cũng có thể được lập trình để tôn trọng nó:

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

Rõ ràng, một trong những "giải pháp" là phải có thành viên trong nhóm của chúng tôi chuẩn hóa trên một số định dạng bên ngoài như Jalopy hoặc JIndent , nhưng đó không phải những gì câu hỏi này là về (cũng được, không quyết định của tôi về dự án này): Tôi đặc biệt tìm kiếm một cách để tránh định dạng Eclipse trên cơ sở đặc biệt.

Một cách lý tưởng, một giải pháp sẽ cho phép tôi chèn các hướng dẫn cho trình định dạng Eclipse mà không yêu cầu các thành viên trong nhóm sử dụng Eclipse để thực hiện bất kỳ cấu hình lại IDE nào (ngoài việc có thể chọn một nhận xét lệnh bất khả tri định dạng: STOP-ECLIPSE-FORMATTINGSTOP-FORMATTING).


1
Chúng tôi đã có vấn đề này. Eclipse nên có một tùy chọn để luôn ngắt một dòng trong hàm tạo Chuỗi trong đó có dấu +, bất kể bit chuỗi tiếp theo có khớp với dòng đó hay không. Nhưng nó không. :-(
JeeBee

Rõ ràng tính năng này đã được bổ sung trong Eclipse 3.6M6: bugs.eclipse.org/bugs/show_bug.cgi?id=27079
Guillaume

Lưu ý: Nếu bạn chỉ đơn giản muốn ngăn chặn nhật thực làm rối các bình luận của mình, thì bạn có thể sử dụng // trước mỗi dòng. Để nhận xét một khối, tô sáng và nhấn Ctrl + /.
John Henckel

Lưu ý rằng bây giờ 10 năm sau, Java 14 có thể sẽ mang các chuỗi nhiều dòng làm cho điều này trở thành quá khứ.
Thorbjørn Ravn Andersen

Câu trả lời:


865

Eclipse 3.6 cho phép bạn tắt định dạng bằng cách đặt một nhận xét đặc biệt, như

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

Các tính năng bật / tắt phải được bật "bật" trong các tùy chọn Eclipse : Java > Code Style > Formatter. Nhấp chuột vào Edit, Off/On Tags, cho phép Enable Off/On tags.

Cũng có thể thay đổi các chuỗi ma thuật trong các tùy chọn - xem các tài liệu Eclipse 3.6 tại đây .

Thêm thông tin

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

Tùy chọn này cho phép bạn xác định một thẻ để tắt và một thẻ để bật trình định dạng (xem tab Tắt / Bật thẻ trong hồ sơ định dạng của bạn):

nhập mô tả hình ảnh ở đây

Bạn cũng cần kích hoạt các cờ từ Java Formatting


7
Tùy chọn "Không bao giờ tham gia dòng" được đề cập ở nơi khác trong trang này cũng rất hữu ích.
xpmatteo

89
Các tính năng bật / tắt phải được bật "bật". Trong các tùy chọn Eclipse: Java> Kiểu mã> Trình định dạng. Nhấp vào nút "Chỉnh sửa", "Tắt / Bật thẻ", đánh dấu vào "Bật / Tắt thẻ".
Domenic D.

2
Điều này không có sẵn trong các tùy chọn Kiểu mã JavaScript , nơi tôi gặp vấn đề hoàn toàn ngược lại với định dạng. :(
Redsandro

11
Các nhóm nên xuất một bản sao các tệp (tệp) Eclipse sang wiki của họ và yêu cầu mọi người sử dụng cùng một bản. Hoạt động tốt cho chúng tôi. ;)
Joseph Lust

FYI Tôi đã phải xóa khoảng trắng giữa dấu // và dấu @ để làm việc này.
Roy Truelove

61

AFAIK từ Eclipse 3.5 M4 trên bộ định dạng có tùy chọn "Không bao giờ tham gia dòng" để duy trì ngắt dòng người dùng. Có lẽ đó là những gì bạn muốn.

Khác có hack xấu xí này

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

1
Vậy ngoài việc thiết lập tùy chọn "Không bao giờ tham gia dòng" tôi còn phải viết những bình luận "ảo" này? Không phải phần "Không bao giờ tham gia dòng" tự hoạt động sao?
Greg Mattes

2
Vâng, tất nhiên nó nên. Các bình luận ảo là một cách tiếp cận khác (trong trường hợp nó không tồn tại hoặc bạn bị mắc kẹt với phiên bản cũ hơn, v.v.).
Chris

Tôi đã sử dụng phương pháp này song song với một mẫu định dạng tùy chỉnh trong TOAD để cho phép tôi loại bỏ SQL cũ khỏi mã JAVA, định dạng lại nó và nhận tất cả các nhận xét không liên quan và sau đó ném lại vào JAVA. Đó là một nỗi đau, nhưng nó cho phép chúng tôi tự động định dạng để lưu mã Java của chúng tôi ngay bây giờ. Cám ơn vì sự gợi ý!
jnt30

Nếu không kiểm tra "Không bao giờ tham gia dòng", các macro bật / tắt không hoạt động với tôi - cảm ơn!
Christoffer Soop

28

Xem câu trả lời này trên SO .

Có một giải pháp khác mà bạn có thể sử dụng để loại bỏ định dạng của các nhận xét khối cụ thể. Sử dụng /*-(lưu ý dấu gạch nối) ở đầu nhận xét khối và định dạng sẽ không bị ảnh hưởng nếu bạn định dạng phần còn lại của tệp.

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

Nguồn: Tài liệu tại Oracle .


2
Đây là câu trả lời tốt nhất vì nó không phụ thuộc vào cấu hình của IDE người dùng. Cảm ơn.
Azim

26

Thay vì tắt định dạng, bạn có thể định cấu hình nó không tham gia các dòng đã được bọc. Tương tự như phản hồi của Jitter, ở đây cho Eclipse STS:

Thuộc tính → Kiểu mã Java → Trình định dạng → Bật cài đặt cụ thể của dự án HOẶC Định cấu hình cài đặt không gian làm việc → Chỉnh sửa → Gói dòng (tab) → kiểm tra "Không bao giờ tham gia các dòng đã được bọc"

Lưu, áp dụng.

nhập mô tả hình ảnh ở đây


1
Tôi nghĩ rằng điều này sẽ giúp cho những thứ như ví dụ SQL, nhưng tôi không chắc rằng nó sẽ đủ cho trường hợp chung là vô hiệu hóa hoàn toàn định dạng IDE.
Greg Mattes

2
Giải pháp này rất tuyệt vời khi sử dụng mẫu trình xây dựng và mức độ liên quan của nó chắc chắn được tăng lên khi giới thiệu lambdas trong Java 8.
Jonas Kongslund

16

Bạn phải bật khả năng thêm các thẻ định dạng. Trong thanh thực đơn đi đến:

Windows Preferences Java Code Style Formatter

Nhấn Editnút. Chọn tab cuối cùng. Lưu ý hộp Bật / Tắt và bật chúng bằng hộp kiểm.


14

Nếu bạn đặt dấu cộng ở đầu dòng, nó sẽ định dạng khác:

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

1
Đây có thể là một sự thỏa hiệp thú vị. Nói chung, tôi muốn hạn chế thay đổi định dạng mã quá nhiều do một số hành vi không mong muốn của một công cụ. Trong trường hợp này, các toán tử nối chuỗi là một sự cố hơn là bản chất của những gì đang xảy ra với SQL. Đó là lý do tại sao tôi thích viết chúng ở cuối mỗi dòng. Tôi cảm thấy rằng SQL nên được nhấn mạnh như là bắt đầu của dòng. Nhưng đây có thể là một cách tốt để đi trong trường hợp không có giải pháp cho phép tôi duy trì định dạng mong muốn của mình. Cảm ơn!
Greg Mattes

8
Không có gì. Trên thực tế, tôi đã đặt các dấu + của mình ở hàng đầu trong nhiều thập kỷ và không để đánh lừa người định dạng. Tôi thích chúng ở phía trước, bởi vì nó làm cho những gì đang diễn ra rõ ràng hơn với tôi: những gì ở cuối dòng đôi khi bị mất. Đó là tiêu chuẩn của dự án ở một nơi nào đó khi chúng tôi sử dụng các trình biên dịch chế biến gỗ, và nó bị mắc kẹt với tôi.
CPerkins

5

Tôi đang sử dụng các phần chuỗi có chiều rộng cố định (được đệm bằng khoảng trắng) để tránh việc trình định dạng làm rối thụt chuỗi SQL của tôi. Điều này mang lại cho bạn kết quả hỗn hợp và sẽ không hoạt động khi khoảng trắng không bị bỏ qua như trong SQL, nhưng có thể hữu ích.

    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

Kết thúc mỗi dòng bằng dấu gạch chéo kép "//". Điều đó sẽ giữ cho nhật thực không di chuyển tất cả chúng trên cùng một đường thẳng.


4

Phương pháp thay thế: Trong Eclipse 3.6, trong phần "Gói dòng", sau đó "Cài đặt chung" có một tùy chọn để "Không bao giờ tham gia các dòng đã được gói." Điều này có nghĩa là trình định dạng sẽ gói các dòng dài nhưng không hoàn tác bất kỳ gói nào bạn đã có.


4

@xpmatteo có câu trả lời là vô hiệu hóa các phần của mã, nhưng ngoài ra, cài đặt nhật thực mặc định phải được đặt thành chỉ định dạng các dòng mã được chỉnh sửa thay vì toàn bộ tệp.

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

Điều này sẽ ngăn điều đó xảy ra ngay từ đầu vì đồng nghiệp của bạn đang định dạng lại mã mà họ không thực sự thay đổi. Đây là một cách thực hành tốt để ngăn chặn các rủi ro khiến diff trên nguồn của bạn trở nên vô dụng (khi toàn bộ tệp được định dạng lại do các khác biệt về cài đặt định dạng nhỏ).

Nó cũng sẽ ngăn việc định dạng lại nếu tùy chọn thẻ bật / tắt bị tắt.


2

Các bình luận ảo, thêm //nơi bạn muốn dòng mới, là tuyệt vời!

  1. @Formatter: off thêm một tham chiếu từ mã vào trình chỉnh sửa. Các mã nên, theo tôi, không bao giờ có tài liệu tham khảo như vậy.

  2. Các bình luận ảo (//) sẽ hoạt động bất kể công cụ định dạng được sử dụng. Bất kể Eclipse hay InteliJ hay bất kỳ trình soạn thảo nào bạn sử dụng. Điều này thậm chí hoạt động với Định dạng Java Google rất đẹp

  3. Các bình luận ảo (//) sẽ hoạt động trên tất cả các ứng dụng của bạn. Nếu bạn cũng có Javascript và có lẽ sử dụng một cái gì đó như JSBeautifier . Bạn có thể có kiểu mã tương tự cũng trong Javascript.

  4. Trên thực tế, bạn có thể muốn định dạng phải không? Bạn muốn loại bỏ tab / không gian hỗn hợp và dấu cách. Bạn muốn thụt dòng theo tiêu chuẩn mã. Những gì bạn KHÔNG muốn là một hàng dài. Đó, và chỉ có thế, là những gì bình luận ảo cho bạn!


-3

Hack này hoạt động:

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

Tôi sẽ đề nghị không sử dụng các định dạng. Mã xấu nên nhìn xấu không tốt giả tạo. Mã tốt cần có thời gian. Bạn không thể gian lận về chất lượng. Định dạng là một phần của chất lượng mã nguồn.


8
Không sử dụng trình định dạng chỉ là một ý tưởng tồi; trình định dạng giúp bắt lỗi và giữ mã ở trạng thái nhất quán.
Francis Upton IV

Một gợi ý thú vị, nhưng tôi không thấy cách định dạng cho chúng ta biết mã có tốt hay không.
Chris

2
Tôi nghĩ những gì anh ấy nói là anh ấy cảm thấy rằng mã được viết kém, định dạng kém nên được giữ nguyên - thay vì định dạng nó với hy vọng "cải thiện nó". Mã được viết kém, định dạng kém nên "dính" bằng cách nào đó để có thể dễ dàng xác định. Không hoàn toàn chắc chắn rằng tôi hoàn toàn đồng ý, nhưng tôi nghĩ đó là ý tưởng.
Greg Mattes

1
@Francis - Lỗi: Làm thế nào có thể tự động định dạng mã tìm lỗi? Tính nhất quán: Tính nhất quán là một đối số tốt nhưng chất lượng mã tổng thể quan trọng hơn. Bạn có thể xác định một quy trình nhất quán tốt đẹp cho lật bánh hamburger nhưng nó sẽ không bao giờ hoạt động cho ẩm thực haute. Nấu ăn có thể là một hoạt động khá phức tạp hoặc tầm thường nếu bạn bỏ qua đủ sự thật. Nếu bạn nghĩ rằng phát triển phần mềm giống như các công cụ lật bánh hamburger thực thi tính nhất quán là dành cho bạn. Đây không phải là một đối số chống lại các dòng hướng dẫn định dạng nhưng nếu các nhà phát triển không quan tâm đến các nguyên tắc này thì sẽ không quan tâm đến các yếu tố cần thiết khác.
Thomas Jung

4
Đối số của tôi ở đây: Tôi viết mã tốt và tôi tuân theo các dòng hướng dẫn định dạng. Nhưng tôi là LAZY. Tại sao tôi phải chèn đúng số lượng khoảng trắng và ngắt dòng khi tôi có thể viết năm dòng mã cẩu thả của mình, nhấn nút định dạng và hài lòng? SAU Tôi đã định dạng mã, sử dụng công cụ của mình để đảm bảo kết quả luôn hoàn hảo, tôi cũng giống như bất kỳ ai về định dạng. KHÔNG có đối số chống lại việc dính vào các dòng hướng dẫn (khác là chúng có thể đặc biệt xấu) nếu định dạng chỉ là một kestroke. Tất cả các thành viên dự án chia sẻ các cài đặt định dạng mã giống nhau.
Mỗi Wiklander
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.