Bagaimana cara mematikan pemformat kode Eclipse untuk bagian tertentu dari kode Java?

488

Saya punya beberapa kode Java dengan pernyataan SQL yang ditulis sebagai string Java (tolong jangan OR / M flamewars, SQL yang tertanam adalah apa adanya - bukan keputusan saya).

Saya telah memecah pernyataan SQL secara semantik menjadi beberapa string bersambung atas beberapa baris kode untuk kemudahan pemeliharaan. Jadi, bukannya sesuatu seperti:

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

Saya punya sesuatu seperti:

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

Gaya ini membuat SQL lebih mudah dibaca dan dipelihara (IMHO), terutama untuk kueri yang lebih besar. Sebagai contoh, saya dapat menempatkan editor saya ke mode "menimpa" dan memodifikasi teks di tempat cukup mudah.

Perhatikan bahwa masalah ini menggeneralisasi di luar contoh khusus SQL. Kode apa pun yang ditulis dengan pemformatan vertikal apa pun, khususnya konstruksi tabular, rentan terhadap kehancuran oleh printer yang cantik.

Sekarang, beberapa anggota proyek menggunakan editor Eclipse dan pemformatan semantik sering dihancurkan ketika mereka memformat seluruh file sumber.

Apakah ada cara untuk menginstruksikan Eclipse untuk mengabaikan jalur sumber tertentu sehubungan dengan pemformatan?

Saya mencari sesuatu seperti komentar khusus yang mengubah formatter Eclipse. Idealnya, komentar seperti itu dapat dikonfigurasi untuk menjadi apa pun yang kita pilih, dan pemformat lain dapat diprogram untuk menghormatinya juga:

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

Jelas, satu "solusi" adalah meminta anggota tim kami melakukan standarisasi pada beberapa formatter eksternal seperti Jalopy atau JIndent , tapi bukan itu yang dimaksud dengan pertanyaan ini (juga, bukan keputusan saya tentang proyek ini): Saya secara khusus mencari cara untuk hindari formatter Eclipse secara ad-hoc.

Idealnya, sebuah solusi akan memungkinkan saya untuk memasukkan instruksi untuk formatter Eclipse tanpa mengharuskan anggota tim menggunakan Eclipse untuk melakukan konfigurasi ulang IDE apa pun (selain dari kemungkinan memilih komentar perintah agnostik formatter: STOP-ECLIPSE-FORMATTINGSTOP-FORMATTING).

Greg Mattes
sumber
1
Kami punya masalah ini. Eclipse harus memiliki opsi untuk selalu memecah baris dalam konstruktor String di mana + adalah, terlepas dari apakah bit string berikutnya akan cocok di baris. Tapi ternyata tidak. :-(
JeeBee
Rupanya fitur ini ditambahkan di Eclipse 3.6M6: bugs.eclipse.org/bugs/show_bug.cgi?id=27079
Guillaume
Catatan: Jika Anda hanya ingin mencegah gerhana mengacaukan komentar Anda, maka Anda dapat menggunakan // di depan setiap baris. Untuk mengomentari blok, sorot dan tekan Ctrl + /.
John Henckel
Perhatikan bahwa sekarang 10 tahun kemudian, Java 14 mungkin akan membawa string multi-line yang menjadikan hal ini sebagai masa lalu.
Thorbjørn Ravn Andersen

Jawaban:

865

Eclipse 3.6 memungkinkan Anda mematikan pemformatan dengan memberikan komentar khusus, seperti

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

On / off fitur harus diaktifkan "pada" dalam preferensi Eclipse: Java > Code Style > Formatter. Klik Edit, Off/On Tags, aktifkan Enable Off/On tags.

Dimungkinkan juga untuk mengubah string ajaib dalam preferensi - lihat dokumen Eclipse 3.6 di sini .

Informasi Lebih Lanjut

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

Preferensi ini memungkinkan Anda untuk menetapkan satu tag untuk menonaktifkan dan satu tag untuk mengaktifkan formatter (lihat tab Off / On Tag di profil formatter Anda):

masukkan deskripsi gambar di sini

Anda juga harus mengaktifkan bendera dari Java Formatting

xpmatteo
sumber
7
Opsi "Never join lines" yang disebutkan di bagian lain halaman ini juga sangat berguna.
xpmatteo
89
Fitur on / off harus dinyalakan "on". Dalam preferensi Eclipse: Java> Code Style> Formatter. Klik tombol "Edit", "Tag Tidak Aktif / Aktif", centang "Aktifkan Tag Nonaktif / Aktif".
Domenic D.
2
Ini tidak tersedia dalam preferensi Gaya Kode JavaScript , di mana saya memiliki masalah yang berlawanan dengan pemformatan. :(
Redsandro
11
Tim harus mengekspor salinan Eclipse prefs (file) ke wiki mereka dan meminta semua orang untuk menggunakan yang sama. Bekerja dengan baik untuk kita. ;)
Joseph Lust
FYI saya harus menghapus spasi antara tanda // dan @ untuk membuatnya berfungsi.
Roy Truelove
61

AFAIK dari Eclipse 3.5 M4 pada formatter memiliki opsi "Never Join Lines" yang mempertahankan jeda baris pengguna. Mungkin itu yang Anda inginkan.

Kalau tidak ada hack jelek ini

String query = //
    "SELECT FOO, BAR, BAZ" + //
    "  FROM ABC"           + //
    " WHERE BAR > 4";
naik opelet
sumber
1
Jadi selain mengatur opsi "Never Join Lines" saya juga harus menulis komentar "phantom" ini? Tidakkah bagian "Never Join Lines" bekerja dengan sendirinya?
Greg Mattes
2
Ya tentu saja harus begitu. Komentar hantu adalah pendekatan alternatif (jika tidak ada, atau Anda terjebak dengan versi sebelumnya, dll.).
Chris
Saya telah menggunakan pendekatan ini bersama-sama dengan template pemformatan kustom di TOAD untuk memungkinkan saya menghapus SQL lama dari kode JAVA, memformat ulang dan mendapatkan semua komentar asing dan kemudian melemparkannya kembali ke JAVA. Ini menyebalkan, tetapi memungkinkan kami untuk memformat otomatis pada menyimpan kode Java kami sekarang. Terima kasih untuk sarannya!
jnt30
Tanpa memeriksa "Never join lines" makro on / off tidak berfungsi untuk saya - terima kasih!
Christoffer Soop
28

Lihat jawaban ini di SO .

Ada solusi lain yang dapat Anda gunakan untuk menekan pemformatan komentar blok tertentu. Gunakan /*-(perhatikan tanda hubung) di awal komentar blokir, dan pemformatan tidak akan terpengaruh jika Anda memformat sisa file.

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

Sumber: Dokumentasi di Oracle .

Renaud
sumber
2
Ini adalah jawaban terbaik karena tidak tergantung pada konfigurasi IDE pengguna. Terima kasih.
Azim
26

Alih-alih mematikan pemformatan, Anda dapat mengonfigurasinya untuk tidak bergabung dengan garis yang sudah dibungkus. Mirip dengan respons Jitter, inilah untuk Eclipse STS:

Properti → Java Code Style → Formatter → Aktifkan pengaturan spesifik proyek ATAU Konfigurasikan Pengaturan Workspace → Edit → Pembungkus Baris (tab) → centang "Jangan pernah bergabung dengan baris yang sudah dibungkus"

Simpan, terapkan.

masukkan deskripsi gambar di sini

ilinca
sumber
1
Saya pikir ini akan membantu untuk hal-hal seperti contoh SQL, tapi saya tidak yakin itu akan cukup untuk kasus umum menonaktifkan sepenuhnya formatter IDE.
Greg Mattes
2
Solusi ini sangat baik ketika menggunakan pola pembangun dan relevansinya meningkat dengan diperkenalkannya lambdas di Jawa 8.
Jonas Kongslund
16

Anda harus mengaktifkan kemampuan untuk menambahkan tag formatter. Di menu men ke:

Windows Preferences Java Code Style Formatter

Tekan Edittombolnya. Pilih tab terakhir. Perhatikan kotak Nyala / Mati dan aktifkan mereka dengan kotak centang.

ZilWerks
sumber
14

Jika Anda meletakkan tanda plus di awal baris, itu memformat berbeda:

String query = 
    "SELECT FOO, BAR, BAZ" 
    +    "  FROM ABC"           
    +    " WHERE BAR > 4";
CPerkins
sumber
1
Ini mungkin kompromi yang menarik. Secara umum, saya ingin menahan diri dari mengubah format kode terlalu banyak karena beberapa perilaku yang tidak diinginkan dari satu alat. Dalam hal ini, operator rangkaian string lebih merupakan kecelakaan daripada inti dari apa yang terjadi dengan SQL. Itu sebabnya saya lebih suka menuliskannya di akhir setiap baris. Saya merasa bahwa SQL harus ditekankan sebagai awal baris. Tapi ini mungkin cara yang baik untuk pergi tanpa adanya solusi yang memungkinkan saya mempertahankan format yang saya inginkan. Terima kasih!
Greg Mattes
8
Sama-sama. Sebenarnya, saya telah memasang tanda + saya di garis depan selama beberapa dekade, dan tidak membodohi formatter. Saya lebih suka mereka di depan, karena itu membuat apa yang terjadi menjadi lebih jelas bagi saya: apa yang ada di akhir garis kadang hilang. Itu adalah standar proyek di suatu tempat jauh ketika kami menggunakan kompiler woodburning, dan itu macet dengan saya.
CPerkins
5

Saya menggunakan bagian string tetap lebar (diisi dengan spasi putih) untuk menghindari formatter mengacaukan indentasi string SQL saya. Ini memberi Anda hasil yang beragam, dan tidak akan berfungsi di mana spasi tidak diabaikan seperti di SQL, tetapi dapat membantu.

    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                          ";
Guus
sumber
5

Akhiri setiap baris dengan garis miring ganda "//". Itu akan mencegah gerhana dari memindahkan mereka semua ke jalur yang sama.

Evvo
sumber
4

Metode alternatif: Di Eclipse 3.6, di bawah "Pembungkus Baris" lalu "Pengaturan Umum" ada opsi untuk "Jangan pernah bergabung dengan saluran yang sudah dibungkus." Ini berarti pemformat akan membungkus garis panjang tetapi tidak membatalkan pembungkus yang sudah Anda miliki.

kmccoy
sumber
4

@xpmatteo memiliki jawaban untuk menonaktifkan sebagian kode, tetapi selain itu, pengaturan gerhana standar harus ditetapkan hanya untuk memformat baris kode yang diedit alih-alih seluruh file.

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

Ini akan mencegahnya terjadi sejak awal karena rekan kerja Anda memformat ulang kode yang sebenarnya tidak mereka ubah. Ini adalah praktik yang baik untuk mencegah kecelakaan yang membuat perbedaan pada kontrol sumber Anda tidak berguna (ketika seluruh file diformat ulang karena perbedaan pengaturan format kecil).

Ini juga akan mencegah pemformatan ulang jika opsi on / off tag dimatikan.

Robin
sumber
2

Komentar hantu, menambahkan di //mana Anda ingin baris baru, hebat!

  1. @Formatter: off menambahkan referensi dari kode ke editor. Menurut saya, kode tidak boleh memiliki referensi seperti itu.

  2. Komentar hantu (//) akan berfungsi terlepas dari alat pemformatan yang digunakan. Terlepas dari Eclipse atau InteliJ atau editor apa pun yang Anda gunakan. Ini bahkan bekerja dengan Google Java Format yang sangat bagus

  3. Komentar hantu (//) akan berfungsi di seluruh aplikasi Anda. Jika Anda juga memiliki Javascript dan mungkin menggunakan sesuatu seperti JSBeautifier . Anda dapat memiliki gaya kode serupa juga di Javascript.

  4. Sebenarnya, Anda mungkin DO ingin memformat, bukan? Anda ingin menghapus tab / spasi campuran dan spasi tambahan. Anda ingin membuat indentasi baris sesuai dengan standar kode. Apa yang Anda TIDAK inginkan adalah garis panjang. Itu, dan hanya itu, yang diberikan oleh komentar hantu itu!

Tomas Bjerre
sumber
-3

Retasan ini berfungsi:

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

Saya sarankan untuk tidak menggunakan formatter. Kode buruk seharusnya terlihat buruk, tidak terlalu bagus. Kode yang baik membutuhkan waktu. Anda tidak dapat menipu kualitas. Memformat adalah bagian dari kualitas kode sumber.

Thomas Jung
sumber
8
Tidak menggunakan formatter adalah ide yang buruk; formatter membantu menangkap kesalahan dan menjaga kode dalam kondisi yang konsisten.
Francis Upton IV
Saran yang menarik, tetapi saya tidak melihat bagaimana pemformatan memberi tahu kami apakah kode itu baik atau tidak.
Chris
2
Saya pikir apa yang dia katakan adalah dia merasa bahwa kode yang ditulis dengan buruk, diformat dengan buruk harus disimpan apa adanya daripada memformatnya dengan harapan "memperbaikinya." Kode yang ditulis dengan buruk, berformat buruk harus "menonjol" entah bagaimana sehingga dapat dengan mudah diidentifikasi. Tidak begitu yakin bahwa saya setuju sepenuhnya, tetapi saya pikir itulah idenya.
Greg Mattes
1
@Francis - Bugs: Bagaimana bug kode diformat secara otomatis? Konsistensi: Konsistensi adalah argumen yang bagus tetapi kualitas kode keseluruhan lebih penting. Anda dapat mendefinisikan proses konsisten bagus untuk membalik hamburger tetapi tidak akan berhasil untuk masakan haute. Memasak a bisa menjadi kegiatan yang cukup rumit atau sepele jika Anda mengabaikan fakta yang cukup. Jika Anda berpikir bahwa pengembangan perangkat lunak seperti alat membalik hamburger yang menegakkan konsistensi adalah untuk Anda. Ini bukan argumen terhadap pemformatan garis panduan tetapi jika pengembang tidak peduli tentang pedoman ini, mereka tidak akan peduli dengan hal-hal penting lainnya.
Thomas Jung
4
Argumen saya di sini: Saya menulis kode yang baik dan saya tetap berpegang pada baris panduan pemformatan. Tapi saya LAZY. Mengapa saya harus memasukkan jumlah spasi dan jeda baris yang benar ketika saya bisa menulis lima baris kode ceroboh, tekan tombol format dan berbahagia? SETELAH saya telah memformat kode, menggunakan alat saya yang memastikan hasilnya selalu sempurna, saya sama nazinya dengan siapa pun tentang pemformatan. Tidak ada argumen yang menentang menempel pada garis panduan (selain itu bahwa mereka mungkin sangat buruk) jika format hanya berjarak kestroke. Semua anggota proyek berbagi pengaturan pemformatan kode yang sama.
Per Wiklander