Como desativar o formatador de código Eclipse para determinadas seções do código Java?

488

Eu tenho algum código Java com instruções SQL escritas como strings Java (por favor, não use OR / M flamewars, o SQL incorporado é o que é - não é minha decisão).

Dividi as instruções SQL semanticamente em várias seqüências concatenadas em várias linhas de código para facilitar a manutenção. Então, em vez de algo como:

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

Eu tenho algo como:

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

Esse estilo torna o SQL muito mais fácil de ler e manter (IMHO), especialmente para consultas maiores. Por exemplo, posso colocar meu editor no modo "substituir" e modificar o texto no local com bastante facilidade.

Observe que esse problema se generaliza além do exemplo específico de SQL. Qualquer código que seja escrito com qualquer formatação vertical, particularmente construções de tabela, é suscetível à destruição por uma impressora bonita.

Agora, alguns membros do projeto usam o editor Eclipse e a formatação semântica geralmente é destruída quando eles formatam um arquivo de origem inteiro.

Existe uma maneira de instruir o Eclipse a ignorar certas linhas de origem com relação à formatação?

Estou procurando algo como um comentário especial que alterna o formatador Eclipse. Idealmente, esse comentário pode ser configurável para ser o que escolhermos, e outros formatadores também podem ser programados para respeitá-lo:

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

Obviamente, uma "solução" é fazer com que os membros da nossa equipe padronizem em algum formatador externo, como Jalopy ou JIndent , mas não é disso que trata esta questão (também, não é minha decisão sobre esse projeto): estou procurando especificamente uma maneira de evite o formatador Eclipse em uma base ad-hoc.

Idealmente, uma solução permitirá que eu insira instruções para o formatador Eclipse sem exigir que os membros da equipe que usam o Eclipse realizem qualquer reconfiguração do IDE (além de possivelmente escolher um comentário de comando independente do formatador : STOP-ECLIPSE-FORMATTINGSTOP-FORMATTING).

Greg Mattes
fonte
1
Nós tivemos esse problema. O Eclipse deve ter uma opção para sempre quebrar uma linha em um construtor String onde um + é, independentemente de o próximo pedaço de string caber na linha. Mas isso não acontece. :-(
JeeBee
Aparentemente, esse recurso foi adicionado no Eclipse 3.6M6: bugs.eclipse.org/bugs/show_bug.cgi?id=27079
Guillaume
Nota: Se você simplesmente deseja impedir que o eclipse estrague seus comentários, você pode usar // na frente de cada linha. Para comentar um bloco, destaque e pressione Ctrl + /.
John Henckel 12/02
Observe que agora 10 anos depois, o Java 14 provavelmente trará seqüências de várias linhas, tornando isso uma coisa do passado.
Thorbjørn Ravn Andersen

Respostas:

865

O Eclipse 3.6 permite desativar a formatação colocando um comentário especial, como

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

ON / OFF características tem que ser transformado "on" nas preferências do Eclipse: Java > Code Style > Formatter. Clique em Edit, Off/On Tags, ative Enable Off/On tags.

Também é possível alterar as sequências mágicas nas preferências - confira os documentos do Eclipse 3.6 aqui .

Mais Informações

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

Essa preferência permite definir uma tag para desativar e uma tag para ativar o formatador (consulte a guia Tags desativadas / ativadas no perfil do formatador):

insira a descrição da imagem aqui

Você também precisa ativar os sinalizadores de Java Formatting

xpmatteo
fonte
7
A opção "Nunca ingressar nas linhas" mencionada em outras partes desta página também é muito útil.
xpmatteo 12/01
89
Os recursos de ativação / desativação devem ser "ativados". Nas preferências do Eclipse: Java> Estilo de Código> Formatador. Clique no botão "Editar", "Marcas ativadas / desativadas", marque "Ativar marcas ativadas / desativadas".
Domenic D.
2
Isso não está disponível nas preferências de Estilo de código JavaScript , onde tenho exatamente o problema oposto com a formatação. :(
Redsandro
11
As equipes devem exportar uma cópia dos prefs (arquivo) do Eclipse para o wiki e exigir que todos usem o mesmo. Funciona bem para nós. ;)
Joseph Lust
Para sua informação, tive que remover o espaço entre o // e o sinal @ para que isso funcionasse.
Roy Truelove
61

O AFAIK do Eclipse 3.5 M4 no formatador possui uma opção "Never Join Lines", que preserva as quebras de linhas do usuário. Talvez isso faça o que você quer.

Senão, existe esse truque feio

String query = //
    "SELECT FOO, BAR, BAZ" + //
    "  FROM ABC"           + //
    " WHERE BAR > 4";
nervosismo
fonte
1
Então, além de definir a opção "Never Join Lines", também tenho que escrever esses comentários "fantasmas"? A parte "Never Join Lines" não deve funcionar por si só?
Greg Mattes
2
Sim, claro que deveria. Os comentários fantasmas são uma abordagem alternativa (caso não exista, ou você esteja preso a uma versão anterior etc.).
31420 Chris
Eu usei essa abordagem em conjunto com um modelo de formatação personalizado no TOAD para permitir a remoção do SQL antigo do código JAVA, reformatá-lo e obter todos os comentários externos e depois jogá-lo novamente no JAVA. É uma dor, mas nos permitiu formatar automaticamente e salvar nosso código Java agora. Obrigado pela sugestão!
jnt30
Sem marcar a opção "Nunca unir linhas", as macros ativadas / desativadas não funcionam para mim - obrigado!
Christoffer Soop
28

Veja esta resposta no SO .

Há outra solução que você pode usar para suprimir a formatação de comentários de bloco específicos. Use /*-(observe o hífen) no início do comentário do bloco e a formatação não será afetada se você formatar o restante do arquivo.

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

Fonte: Documentação na Oracle .

Renaud
fonte
2
Essa é a melhor resposta, pois não depende da configuração do IDE do usuário. Obrigado.
Azim
26

Em vez de desativar a formatação, você pode configurá-lo para não ingressar nas linhas quebradas. Semelhante à resposta do Jitter, aqui está o Eclipse STS:

Propriedades → Estilo do código Java → Formatador → Ativar configurações específicas do projeto OU Definir configurações da área de trabalho → Editar → Quebra automática de linhas (guia) → marque "Nunca unir linhas já quebradas"

Salvar, aplicar.

insira a descrição da imagem aqui

ilinca
fonte
1
Acho que isso ajudaria em coisas como o exemplo SQL, mas não tenho certeza de que seria suficiente para o caso geral de desabilitar completamente o formatador IDE.
Greg Mattes 31/07
2
Esta solução é excelente quando se utiliza o padrão do construtor e sua relevância é certamente aumentou com a introdução de lambdas em Java 8.
Jonas Kongslund
16

Você precisa ativar a capacidade de adicionar as tags do formatador. Na barra de menus, vá para:

Windows Preferences Java Code Style Formatter

Pressione o Editbotão Escolha a última aba. Observe a caixa On / Off e ative-os com uma caixa de seleção.

ZilWerks
fonte
14

Se você colocar o sinal de mais no início da linha, ele formata de forma diferente:

String query = 
    "SELECT FOO, BAR, BAZ" 
    +    "  FROM ABC"           
    +    " WHERE BAR > 4";
CPerkins
fonte
1
Esse pode ser um compromisso interessante. Em geral, eu gostaria de não alterar muito a formatação do código devido a algum comportamento indesejável de uma ferramenta. Nesse caso, os operadores de concatenação de strings são mais um acidente do que a essência do que está acontecendo com o SQL. É por isso que prefiro escrevê-las no final de cada linha. Eu sinto que o SQL deve ser enfatizado como o início da linha. Mas esse pode ser um bom caminho a seguir na ausência de uma solução que permita preservar a formatação desejada. Obrigado!
Greg Mattes
8
De nada. Na verdade, venho colocando meus sinais de + na frente das linhas há décadas, e não para enganar o formatador. Eu prefiro eles na frente, porque isso torna o que está acontecendo mais claro para mim: o que no final de uma linha às vezes se perde. Era o padrão do projeto em algum lugar quando usamos os compiladores a lenha, e está preso comigo.
cperkins
5

Estou usando partes de string de largura fixa (preenchidas com espaço em branco) para evitar que o formatador atrapalhe meu recuo de string SQL. Isso fornece resultados variados e não funciona onde os espaços em branco não são ignorados como no SQL, mas podem ser úteis.

    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
fonte
5

Termine cada uma das linhas com uma barra dupla "//". Isso impedirá que o eclipse os mova para a mesma linha.

Evvo
fonte
4

Método alternativo: No Eclipse 3.6, em "Quebra de Linha" e "Configurações Gerais", há uma opção para "Nunca unir linhas já quebradas". Isso significa que o formatador quebra linhas longas, mas não desfaz nenhuma quebra que você já possui.

kmccoy
fonte
4

O @xpmatteo tem a resposta para desativar partes do código, mas, além disso, as configurações padrão do eclipse devem ser definidas para formatar apenas linhas de código editadas, em vez de todo o arquivo.

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

Isso impediria que isso acontecesse em primeiro lugar, já que seus colegas de trabalho estão reformatando o código que na verdade não foram alterados. Essa é uma boa prática para evitar contratempos que tornam o diff no seu controle de origem inútil (quando um arquivo inteiro é reformatado devido a pequenas diferenças nas configurações de formato).

Também impediria a reformatação se a opção de ligar / desligar tags estivesse desativada.

Robin
fonte
2

Os comentários fantasmas, adicionando //onde você deseja novas linhas, são ótimos!

  1. O @formatter: off adiciona uma referência do código ao editor. O código, na minha opinião, nunca deve ter essas referências.

  2. Os comentários fantasmas (//) funcionarão independentemente da ferramenta de formatação usada. Independentemente do Eclipse ou InteliJ ou qualquer editor que você use. Isso funciona mesmo com o ótimo Google Java Format

  3. Os comentários fantasmas (//) funcionarão em todo o aplicativo. Se você também possui Javascript e talvez use algo como JSBeautifier . Você pode ter um estilo de código semelhante também no Javascript.

  4. Na verdade, você provavelmente deseja formatar certo? Você deseja remover tabulação / espaço misto e espaços à direita. Você deseja recuar as linhas de acordo com o padrão do código. O que você NÃO quer é uma longa fila. É isso, e apenas isso, o que o comentário fantasma dá a você!

Tomas Bjerre
fonte
-3

Este hack funciona:

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

Eu sugeriria não usar o formatador. O código incorreto deve parecer ruim e não artificialmente bom. Um bom código leva tempo. Você não pode trapacear na qualidade. A formatação faz parte da qualidade do código-fonte.

Thomas Jung
fonte
8
Não usar o formatador é apenas uma má idéia; o formatador ajuda a detectar erros e mantém o código em um estado consistente.
Francis Upton IV
Uma sugestão interessante, mas não vejo como a formatação nos diz se o código é bom ou não.
22430 Chris
2
Acho que o que ele está dizendo é que ele acha que o código mal escrito e mal formatado deve ser mantido como está, em vez de formatá-lo na esperança de "melhorá-lo". Código mal escrito e mal formatado deve "destacar-se" de alguma forma, para que possa ser facilmente identificado. Não tenho certeza se concordo totalmente, mas acho que é essa a ideia.
Greg Mattes
1
@Francis - Bugs: Como o código auto-formatado encontra bugs? Consistência: a consistência é um bom argumento, mas a qualidade geral do código é mais importante. Você pode definir um processo consistente e agradável para lanches de hambúrguer, mas isso nunca funcionará para a alta cozinha. Cozinhar um pode ser uma atividade razoavelmente complicada ou trivial se você ignorar fatos suficientes. Se você acha que o desenvolvimento de software é como as ferramentas para lançar hambúrgueres que reforçam a consistência, são para você. Este não é um argumento contra a formatação de linhas-guia, mas se os desenvolvedores não se importam com essas diretrizes, eles não se importam com outros itens essenciais.
9781 Thomas Jung
4
Meu argumento aqui: escrevo um bom código e mantenho as linhas de guia de formatação. Mas eu sou preguiçoso. Por que devo inserir a quantidade correta de espaços e quebras de linha quando posso escrever minhas cinco linhas de código incorreto, pressionar o botão de formatação e ser feliz? Depois de formatar o código, usando minha ferramenta que garante que o resultado seja sempre perfeito, sou tão nazista quanto qualquer um sobre a formatação. Não há argumento contra a aderência às linhas de guia (exceto que elas possam ser particularmente ruins) se a formatação estiver a apenas um passo de distância. Todos os membros do projeto compartilham as mesmas configurações de formatação de código.
Por Wiklander