sexta-feira, 20 de março de 2009

Opção para descrever o formato das mensagens de erro do compilador.

Após mudar o compilador que o vim chamará ('makeprg') é preciso dizer o formato
das mensagens de erro que ele produz.

Use:
:set errorformat={string},{string},...
para isso.
O string é uma mensagem de erro típica com o caractere '%' usado para
identificar operações especiais (como scanf do C):
%f       Nome do arquivo
%l Número da linha
%c Coluna
%t Tipo de erro (um único caractere)
%n Número do erro
%m Mensagem de erro
%r Corresponde ao resto da linha
%*{char} Corresponde (e pula) qualquer conversão scanf especificada por {char}.
%% O caractere %
Quando se está compilando um programa, você pode atravessar vários diretórios.
O programa GNU 'make' imprime uma mensagem quando ele entra e sai de um diretório.
Para obter o nome do arquivo correto, o Vim precisa estar consciente desta
mudança.
As seguintes especificações de formato são usadas para avisar o Vim sobre
mudanças de diretório:
%D Especifica uma mensagem impressa ao entrar em um diretório. 
O %f neste string indica o diretório entrado.
%X Especifica a mensagem de saída do diretório. O %f neste string especifica o
%diretório que o make passou.
Alguns compiladores, tais como o GNU GCC imprime mensagens de erro muito
verbosas.
Eis um exemplo de mensagem de uma variável não declarada:
tmp.c: In function `main’:
tmp.c:3: 'i' undeclared (first use in this function)
tmp.c:3: (Each undeclared identifier is reported only once
tmp.c:3: for each function it appears in.)
Se você usar o 'errorformat' default, isto resulta em três mensagens
de erro. Isto é realmente desagradável. Felizmente, o editor Vim reconhece
mensagens de erro multilinha.
Os códigos de formato para mensagens de erro multilinhas são:
%A   Início de uma mensagem multilinha (tipo não especificado)
%E Início de uma mensagem de erro multilinha
%W Início de uma mensagem de aviso multilinha
%C Continuação de uma mensagem multilinha
%Z Fim de uma mensagem multilinha
%G Global; útil somente em conjunto com + ou -
%O Mensagem de arquivo de uma linha: examina a parte identificada
%P Mensagem de arquivo de uma linha: coloca o arquivo %f em cima da pilha
%Q Mensagem de arquivo de uma linha: retira a última mensagem da pilha
Um + ou - pode preceder quaisquer uma das letras. Isto significa o seguinte:
%-letter   Não inclui a linha identifica em qualquer saída.
%+letter Inclui a linha inteira identificada no string de erro %m.
Eis um exemplo de definição do formato de uma mensagem de erro multilinha.

Comece definindo a mensagem inicial.
Essa mensagem corresponde à definição:
tmp.c:3: ‘i’ undeclared (first use in this function)
%E%f:%l:\ %m\ undeclared\ (first\ use\ in\ this\ function)
Note o uso de '\' para dizer ao Vim que o espaço é parte do string. Agora você
tem um problema. Se você usar esta definição, o '%m' irá identificar somente 'i'.
Você quer uma mensagem de erro mais longa. Assim você usa '+' para fazer o Vim
por a linha inteira na mensagem:
%+E%f:%l:\ %m\ undeclared\ (first\ use\ in\ this\ function)
O meio corresponde a isto:
tmp.c:3: (Each undeclared identifier is reported only once
%-C%f:%l:\ (Each\ undeclared\ identifier\ is\ reported\ only\ once
Note o uso do modificado '-' para manter a mensagem fora da lista de mensagens.

O fim do erro é o seguinte:
tmp.c:3: for each function it appears in.)
%-Z%f:%l:\ for\ each\ function\ it\ appears\ in.)
Assim você adiciona estas três linhas para o formato do erro:
%+E%f:%l:\ ‘%*\k*’\ undeclared\ (first\ use\ in\ this\ function),
%-C%f:%l:\ (Each\ undeclared\ identifier\ is\ reported\ only\ once,
%-Z%f:%l:\ for\ each\ function\ it\ appears\ in.)
Isto funciona, mas tem um pequeno problema. Quando o compilador GNU encontra a
segunda variável indefinida, ele não imprime a mensagem de 3 linhas. Ao invés,
ele só imprime a primeira linha. (ele imagina que você já viu as coisas dentro
dos parenteses, assim não tem porque imprimir de novo).

Infelizmente, sua especificação de erro tenta localizar as três linhas.
Portanto, você precisa de uma técnica diferente. A solução é dizer ao Vim para
esquecer sobre as segundas duas linhas:
%-G%f:%l:\ (Each\ undeclared\ identifier\ is\ reported\ only\ once
%-G%f:%l:\ for\ each\ function\ it\ appears\ in.)
Agora você precisa adicionar esta opção para seu arquivo vimrc. Você
adiciona-las sobre a opção 'errorformat' usando o seguinte comando:
“ Isto não irá funcionar
:set errorformat+=
\%-G%f:%l:\ (Each\ undeclared\ identifier\ is\ reported\ only\ once,
\%-G%f:%l:\ for\ each\ function\ it\ appears\ in.)
Note que no Vim, linhas de continuação começam com '\'.Além disso, você
acrescenta uma vírgula entre as mensagens de erro.
No entanto, essa técnica não funciona pois o Vim percorre a lista de strings do
'errorformat' em sequencia, parando na primeira que acha.
O string de erro do compilador GNU (%f:%l:%m) é localizado primeiro, e portanto
você não obtém as suas duas novas mensagens de erro. Você precisa por as
ocorrências mais específica (suas duas novas mensagens) no início.
Isto é realizado com:
" Isto irá funcionar
:set errorformat ^=
\%-G%f:%l:\ (Each\ undeclared\ identifier\ is\ reported\ only\ once,
\%-G%f:%l:\ for\ each\ function\ it\ appears\ in.)
Lembre, o comando set ^= irá adicionar um string no início da lista.

0 comentários:

Postar um comentário