Como uma resposta conforme solicitado.
Existem dois problemas aqui:
- Por padrão,
gccimprime códigos de cores somente quando a saída é um terminal. - Por padrão,
lessnão envia caracteres de cor bruta para o terminal.
Você pode forçar o gcc a imprimir códigos de cores passando a opção -fdiagnostics-color=always . Tenha em atenção que isto irá quebrar várias ferramentas que dependem da análise de erros do compilador.
Você pode forçar o less a enviar códigos de cores para o terminal, passando as opções -r ou -R . Este último é mais seguro, uma vez que só permite códigos para cores ANSI reais.
Resumindo:
gcc -fdiagnostics-color=always a.c 2>&1 | less -R