¿Cómo desactivar el formateador de código Eclipse para ciertas secciones del código Java?


Tengo un código Java con sentencias SQL escritas como cadenas Java (por favor no O/M flamewars, el SQL incrustado es lo que es - no es mi decisión).

He dividido las sentencias SQL semánticamente en varias cadenas concatenadas sobre varias líneas de código para facilitar el mantenimiento. Así que en lugar de algo como:

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

Tengo algo como:

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

Este estilo hace que el SQL sea mucho más fácil de leer y mantener (IMHO), especialmente para consultas más grandes. Por ejemplo, I puede poner mi editor en modo "sobrescribir" y modificar el texto en su lugar con bastante facilidad.

Tenga en cuenta que este problema se generaliza más allá del ejemplo particular de SQL. Cualquier código que se escribe con cualquier formato vertical, en particular construcciones tabulares, es susceptible de destrucción por una bonita impresora.

Ahora, algunos miembros del proyecto usan el editor de Eclipse y el formato semántico a menudo se destruye cuando formatean un archivo fuente completo.

¿Hay una manera de ¿indicar a Eclipse que ignore ciertas líneas de origen con respecto al formato?

Estoy buscando algo como un comentario especial que alterna el formateador de Eclipse. Idealmente, tal comentario podría ser configurable para ser lo que elijamos, y otros formateadores podrían ser programados para respetarlo también:

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

Obviamente, una "solución" es tener a los miembros de nuestro equipo estandarizados en algún formateador externo como Jalopy o JIndent , pero eso no es lo que esta pregunta es sobre (también, no mi decisión sobre este proyecto): Estoy buscando específicamente una manera de evitar el formateador Eclipse sobre una base ad-hoc.

Idealmente, una solución me permitirá insertar instrucciones para el formateador de Eclipse sin requerir que los miembros del equipo que usan Eclipse realicen cualquier reconfiguración IDE (aparte de posiblemente elegir un comando agnóstico del formateador comentario: STOP-ECLIPSE-FORMATTINGSTOP-FORMATTING).

Author: msrd0, 2009-11-30

12 answers

Eclipse 3.6 le permite desactivar el formato colocando un comentario especial, como

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

Las funciones de encendido / apagado tienen que estar activadas en las preferencias de Eclipse: Java > Estilo de Código > Formatter . Haga clic en Editar, Off / On Tags , enable Enable Off/On tags.

También es posible cambiar las cadenas mágicas en las preferencias - echa un vistazo a los documentos de Eclipse 3.6 aquí.

Más Información

Java > Estilo de código > Formateador > Editar > Etiquetas Off/On

Esta preferencia le permite definir una etiqueta para deshabilitar y una etiqueta para habilitar el formateador (consulte la pestaña Etiquetas desactivadas/activadas en su perfil de formateador):

introduzca la descripción de la imagen aquí

También necesita habilitar las banderas de Java Formatting

 791
Author: xpmatteo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-11 13:06:05

AFAIK de Eclipse 3.5 M4 en el formateador tiene una opción "Nunca unir líneas" que conserva los saltos de líneas de usuario. Tal vez eso hace lo que quieres.

De lo contrario hay este truco feo

String query = //
    "SELECT FOO, BAR, BAZ" + //
    "  FROM ABC"           + //
    " WHERE BAR > 4";
 58
Author: jitter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-30 16:48:29

En lugar de desactivar el formato, puede configurarlo para que no se una a líneas ya empaquetadas. Similar a la respuesta de Jitter, aquí está para Eclipse STS:

Properties → Java Code Style → Formatter → Enable project specific settings OR Configure Workspace Settings → Edit → Line Wrapping (tab) → check" Never join already wrapped lines "

Guardar, aplicar.

introduzca la descripción de la imagen aquí

 22
Author: ilinca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-31 14:30:29

Ver esta respuesta en SO.

Hay otra solución que puede usar para suprimir el formato de comentarios de bloques específicos. Utilice /*- (tenga en cuenta el guion) al principio del comentario de bloque, y el formato no se verá afectado si formatea el resto del archivo.

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

Fuente: Documentación en Oracle.

 21
Author: Renaud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:47

Tienes que activar la posibilidad de añadir las etiquetas de formateador. En la barra de menú ir a:

Windows Preferencias Java Estilo de código Formateador

Presione el botón Editar. Elige la última pestaña. Observe la casilla de encendido / apagado y habilítelos con una casilla de verificación.

 16
Author: ZilWerks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-16 00:10:55

Si pones el signo más al principio de la línea, el formato es diferente:

String query = 
    "SELECT FOO, BAR, BAZ" 
    +    "  FROM ABC"           
    +    " WHERE BAR > 4";
 14
Author: CPerkins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-29 22:35:01

Estoy usando partes de cadena de ancho fijo (rellenadas con espacios en blanco) para evitar que el formateador estropee mi sangría de cadena SQL. Esto le da resultados mixtos, y no funcionará donde los espacios en blanco no se ignoran como lo es en SQL, pero puede ser útil.

    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
Author: Guus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-16 11:17:51

Termina cada una de las líneas con una doble barra "//". Eso evitará que Eclipse los mueva a todos a la misma línea.

 5
Author: Evvo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-23 02:12:17

Método alternativo: En Eclipse 3.6, bajo "Ajuste de línea" luego "Configuración general" hay una opción para "Nunca unir líneas ya empaquetadas."Esto significa que el formateador envolverá líneas largas pero no deshará ningún envoltorio que ya tenga.

 4
Author: kmccoy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-16 17:10:48

@xpmatteo tiene la respuesta para deshabilitar porciones de código, pero además de esto, la configuración predeterminada de eclipse debe configurarse para formatear solo las líneas de código editadas en lugar de todo el archivo.

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

Esto habría evitado que sucediera en primer lugar, ya que sus compañeros de trabajo están reformateando el código que en realidad no cambiaron. Esta es una buena práctica para evitar contratiempos que hacen que diff en su control de código fuente sea inútil (cuando se formatea un archivo completo debido a diferencias de ajuste de formato).

También evitaría el reformateo si la opción on/off tags estuviera desactivada.

 4
Author: Robin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-15 15:02:10

Los comentarios phantom, añadiendo // donde quieres nuevas líneas, son geniales!

  1. El @ formatter: off añade una referencia del código al editor. El código, en mi opinión, nunca debería tener tales referencias.

  2. Los comentarios fantasma (//) funcionarán independientemente de la herramienta de formato utilizada. Independientemente de Eclipse o InteliJ o cualquier editor que utilice. Esto incluso funciona con el muy agradable Formato Java de Google

  3. The phantom comentarios (//) funcionará en toda su aplicación. Si también tiene Javascript y tal vez use algo como JSBeautifier. Puede tener un estilo de código similar también en Javascript.

  4. En realidad, probablemente quieras formatear ¿verdad? Desea eliminar tabulaciones/espacios mixtos y espacios finales. Desea sangrar las líneas de acuerdo con el estándar de código. Lo que no quieres es una larga fila. Eso, y solo eso, es lo que da el comentario fantasma ¡tú!

 1
Author: Tomas Bjerre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-26 19:18:46

Este hack funciona:

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

Sugeriría no usar el formateador. El código malo debe verse mal, no artificialmente bueno. Un buen código lleva tiempo. No puedes engañar a la calidad. El formato es parte de la calidad del código fuente.

 -3
Author: Thomas Jung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-30 16:55:03