'^ M' em muitas linhas em arquivos de código-fonte. Como eu posso removê-los?

1

Alguém recentemente me enviou alguns arquivos de código-fonte .cpp . Ao abrir os arquivos com o GNU Emacs ou GVIM, descobri que eles têm um caractere estranho ^M perto do final de cada linha.

Aqui está uma captura de tela mostrando o que quero dizer

Quando abro esses mesmos arquivos de origem com o Gedit, não vejo esses ^M caracteres. O que devo fazer? Há muitos arquivos em questão aqui, portanto, abrir e fazer uma operação de substituição de pesquisa substituindo por uma string vazia se parece com uma operação de back-breaking.

Por incrível que pareça, esses arquivos são compilados corretamente quando eu compilo com o GCC. O que está acontecendo aqui. O que devo fazer?

    
por smilingbuddha 29.02.2012 / 20:20

4 respostas

6

No Unix, o novo caractere de linha é \n e, no Windows, é \r\n . \r ou ^M é o caractere de retorno de carro.

Se o arquivo for gravado em um editor no modo Windows, cada novo caractere de linha terá um caractere de retorno de carro. Se você disser ao seu editor (e se ele entender) tratar os novos caracteres de linha como no Windows, você não verá mais os caracteres ^M .

Como alternativa, você pode executar dos2unix na sua base de código para corrigir esse problema.

E, como você observou corretamente, você não veria nenhum problema na compilação, porque isso não é nenhum caractere extra especial no código, mas apenas uma incompatibilidade entre a interpretação de caracteres de nova linha no Windows e no Linux.

    
por 29.02.2012 / 20:33
1

Você tem um arquivo de origem com finalizações de linha mistas do Windows e do UNIX. Embora o UNIX tenha usado o avanço de linha (às vezes mostrado como ^ J), o Windows usa retorno de linha + alimentação de linha (às vezes exibido como ^ M ^ J). Seu editor vê as linhas do UNIX e diz "este deve ser um arquivo UNIX", mas depois vê as terminações de linha do Windows dispersas e diz "este é um caractere especial, devo mostrá-lo".

Você pode tentar converter o arquivo de uma forma ou de outra. Você pode tentar usar o comando dos2unix para converter em finais de linha do UNIX. Isso funcionará no lado do UNIX, mas o lado do Windows ficará confuso, a menos que você tenha um editor do Windows que saiba as terminações do UNIX.

Ou você pode usar unix2dos e tornar tudo Windows. Se você for consistente com o arquivo inteiro, os editores do UNIX (que tendem a conhecer as terminações do Windows melhor do que os editores do Windows sabem as terminações do UNIX) devem estar bem. Este tempo em particular emacs / gvim estava apenas confuso porque o arquivo era inconsistente.

Como você viu, o compilador não se importa com o final da linha.

    
por 29.02.2012 / 20:40
0

De acordo com este recurso , ^M é um retorno de carro - é por isso que você pode compilar de forma limpa com o GCC .

    
por 29.02.2012 / 20:25
0

O motivo pelo qual você vê isso no emacs / vim é devido a como eles lêem as coisas / como as coisas são codificadas. O ^M é na verdade apenas um Carriage Return (pressionando o botão enter).

De qualquer forma, você pode tentar fazer (no vim, desde que eu não sei o comando apropriado no Emacs) :set ff=unix e, em seguida, :w , que deve transformá-lo em um formato Unix e se livrar dele no próximo tempo você abre isto (iirc).

Ou, se você quiser remover explicitamente ^M do documento, faça uma pesquisa / substituição (no Vim, desde que eu saiba apenas) com :%s/<ctrl + v><ctrl + m>//gc .

( Este link mostra os comandos sobre como fazer um S / R para devoluções no Emacs.

    
por 29.02.2012 / 20:30