O que são esses ^ Ms que continuam aparecendo nos meus arquivos no emacs?

157

Então, acho que isso pode ter a ver com o companheiro de texto, mas trabalhamos em uma equipe pequena e estamos tendo alguns problemas com conflitos de arquivos completos de arquivos quase idênticos no git porque cada linha de um ramo tem um ^ M anexado a ele.

O que esse ^Mpersonagem misterioso deveria fazer e de onde poderia estar?

Nossos desenvolvedores usam emacs no Windows / Mac, TextMate no Mac, coda no Mac e, ocasionalmente, o editor de texto wp-admin.

Alguém já teve esse problema decorrente de um desses?

Neil Sarkar
fonte
3
Para o que vale a pena: pesquise por "ctrl" em vez de ^ #
Broam 30/11/2009
3
A questão maior é: o que você fará sobre isso? As chances são de que o Emacs não as esteja apresentando. Sua equipe deve decidir se os arquivos devem ou não estar no formato DOS (com ^ M) ou no formato Unix (sem ^ M) e aplicá-los.
30809 Trey Jackson

Respostas:

111

No git-config , configure core.autocrlfpara truefazer o git converter automaticamente as terminações de linha corretamente para sua plataforma, por exemplo, execute este comando para uma configuração global:

git config --global core.autocrlf true
Josh Lee
fonte
6
Eu acho que essa é a melhor resposta porque ela responde à pergunta no contexto do OP, ou seja, git.
neontapir
Eu já tinha "[core] \ n autocrlf = true" no meu arquivo '~ / .gitconfig', mas ainda assim eu deixei 'git clone code.google.com/p/pytomtom ' com '^ m' chars ??? ??
Big rico
11
Esta resposta APENAS se aplica se a sua plataforma for Windows! Se você trabalha no Mac / Linux, "true" deve se tornar "input"! Veja help.github.com/articles/dealing-with-line-endings e aqui: stackoverflow.com/questions/9225599/...
K.-Michael Aye
AVISO: essa resposta corrompe muitos outros arquivos quando o git incorretamente "adivinha" que as terminações de linha não são importantes e precisam ser alteradas. Isso é letal para projetos de software em que esses caracteres existem em um arquivo de dados (sim, eu fui queimado por isso, doloroso de quebrar). É uma solução terrível IMHO.
Adam
@ Adam O que exatamente quebra a mudança de terminações de linha? Onde você teve problemas ao trabalhar com dados? Não deve afetar nada, é apenas uma maneira diferente de marcar o final da linha. Eu só quero saber.
MBI 6/18
97

Alguém não está convertendo seus caracteres de final de linha corretamente .

Suponho que seja o pessoal do Windows, pois eles amam seu CRLF. O Unix ama LF e Mac ama CR, até que foi mostrado da maneira Unix.

Broam
fonte
12
Para esclarecimentos: o Mac usou o CR até a versão 10 (OS X), agora usa o LF.
Mikael S
34
Eu sinto que a maneira do Windows é mais lógica, uma vez que os termos CR e LF vêm dos dias das máquinas de escrever. Você precisava fazer as duas coisas: um retorno de carro para obter o ponto de digitação no início da linha e um avanço de linha para rolar uma linha para baixo. A maneira Mac OS Classic (CR) em uma máquina de escrever continuaria substituindo a mesma linha. A maneira Unix (LF) em uma máquina de escrever produziria texto escalonado até você atingir a largura total da página. :)
Otherside
114
@ Outerside: mais lógico apenas no sentido "queremos emular uma máquina de escrever". Não consigo entender por que isso é remotamente útil.
Bryan Oakley #
29
@ Outerside, por que você representaria algo com dois caracteres quando ele pode ser representado com um caractere?
Matthew L
13
@ Matthew G: Tudo pode ser representado em um personagem, desde que muitos de nós concordem com isso. Isso significa que deveríamos? Podemos digitar todas as nossas mensagens sem pontuação, maiúsculas e apenas todas as frases em uma nova linha, e todos entenderiam. Isso significa que deveríamos? Não se trata de "fazer algo porque podemos". Dito isto, eu prefiro o LF também.
precisa saber é
33

^Mé 0x0d, ou seja, o caractere de retorno de carro. Se sua tela parecer

linha 1 ^ M
linha 2 ^ M

o arquivo deve ter vindo do Windows porque a sequência de nova linha padrão no Windows é CR LF( 0x0d 0x0a), enquanto a sequência de nova linha padrão consiste apenas LFno Unices.

Se o arquivo fosse de um sistema Mac OS 9 ou anterior, você o veria como

linha 1 ^ linha 2 ^ M

porque não haveria avanço de linha após os retornos de carro.

Sinan Ünür
fonte
28

Para fazer o ^ M desaparecer no git, digite:

git config --global core.whitespace cr-at-eol

Créditos: https://lostechies.com/keithdahlby/2011/04/06/windows-git-tip-hide-carriage-return-in-diff/

bonif
fonte
1
não muda nada.
Vivex
3
que só faz o dissappear ^ M do visor quando o uso git diff, mas ele ainda está lá
FernandoZ
1
De fato, ele exibe apenas ^ M como espaço em branco, mas git diffainda leva em consideração o ^ M ao comparar arquivos. Remova essa configuração com git config --global --unset core.whitespace( deste tópico ).
Miguelmorin 30/10/19
1
Você também pode omitir o --globalpara apenas configurar o repo atual.
Derek Veit
8

Eles têm a ver com a diferença entre as terminações de linha de estilo DOS e o estilo Unix. Confira o artigo da Wikipedia . Você pode encontrar uma ferramenta dos2unix para ajudar, ou simplesmente escrever um pequeno script para corrigi-lo.

Edit : Encontrei o seguinte código de exemplo Python aqui :

string.replace( str, '\r', '' )
Parappa
fonte
3
No Emacs, isso seria <code> M-: (substituir a string "\ r" "") </code>.
huaiyuan 02/12/2009
7

Estou usando o Android Studio (JetBrains IntelliJ IDEA ) no Mac OS e meu problema foi que ^ M começou a aparecer em alguns arquivos na minha solicitação pull no GitHub . O que funcionou para mim foi alterar o separador de linhas de um arquivo.

Abra o arquivo desejado no editor, vá para Arquivo, vá para Separadores de Linha e escolha a melhor opção para você (para mim era LF - Unix e OS X (\ n) )

De acordo com o próximo artigo, esse problema é resultado de finais confusos de linha entre sistemas operacionais: http://jonathonstaff.com/blog/issues-with-line-endings/

E mais informações você pode encontrar aqui: https://www.jetbrains.com/help/idea/configuring-line-separators.html#d84378e48

insira a descrição da imagem aqui

CookieMonster
fonte
6

em vez de substituir a consulta, você também pode usar o espaço em branco Mx delete-trailing-whitespace

kaineer
fonte
isso não funcionou para mim ... selecionei todo o texto e executei o comando.
ᐅ devrimbaris
isso funcionou para mim. obrigado. @ devrimbaris, você não precisa selecionar nada, basta executar o comando 'M' é a meta-chave ou a tecla de escape. Então Mx é escape então x. Então você digita delete-trailing-whitespace e pressiona return.
astromax
5

~/.emacsColoque o seguinte em seu (ou eqiuvalent)

(defun dos2unix ()
  "Replace DOS eolns CR LF with Unix eolns CR"
  (interactive)
    (goto-char (point-min))
      (while (search-forward "\r" nil t) (replace-match "")))

e então você seria capaz de simplesmente usar M-x dos2unix.

Jakub Narębski
fonte
4

^Mno final da linha no Emacs está indicando um retorno de carro (\ r) seguido por um avanço de linha (\ n). Você verá isso frequentemente se uma pessoa editar arquivos no Windows (onde final de linha é a combinação de caracteres de retorno de carro e nova linha) e editar no Unix ou Linux (onde final de linha é apenas um caractere de nova linha).

A combinação de caracteres geralmente não é prejudicial. Se você estiver usando o controle de origem, poderá configurar o formato de entrada de arquivo de texto para que as linhas sejam ajustadas magicamente para você. Como alternativa, você poderá usar os gatilhos de check-in e check-out que "corrigirão" automaticamente os arquivos para você. Ou, você pode apenas usar uma ferramenta como dos2unix para ajustar manualmente as coisas.

atk
fonte
2

Como todo mundo mencionou. É um estilo de final de linha diferente. O MacOSX usa terminações de linha Unix - ou seja, LF (avanço de linha).

O Windows usa CR (retorno de carro) e LF (avanço de linha) como final de linha. Como você está usando o Windows e o Mac, é aí que o problema se origina.

Se você criar um arquivo no Windows e trazê-lo para o Mac, poderá ver esses caracteres ^ M no final das linhas.

Se você deseja removê-los, você pode fazer isso com muita facilidade no emacs. Apenas destaque e copie o caractere ^ M e faça uma substituição de consulta ^ M por e pronto.

EDIT: Alguns outros links que podem ser úteis. http://xahlee.org/emacs/emacs_adv_tips.html

Este ajuda a configurar o emacs para usar um tipo específico de estilo de final de linha. http://www.emacswiki.org/emacs/EndOfLineTips

Matt
fonte
2

Encontrei esse problema há algum tempo. O ^ M representa um retorno de carro e a pesquisa Ctrl-Q Ctrl-M(Isso cria um literal ^ M) permitirá que você identifique esse caractere no Emacs. Eu fiz algo nesse sentido:

M-x replace-string [ENTER] C-q C-m [ENTER] \n [ENTER]
nedblorf
fonte
2

Se você não possui o utilitário dos2unix instalado no sistema, poderá criar o seu próprio para se livrar dos caracteres de linha de extremidade do Windows:

vi ~/dos2unix.bash:

com o seguinte conteúdo

#!/bin/bash
tr -d '\r' < $1 > repl.tmp
mv -f repl.tmp $1

No seu ~ / .bashrc, adicione a linha:

alias 'dos2unix=~/dos2unix.bash'

Aplicando

dos2unix file_from_PC.txt

irá remover ^ M caracteres nas linhas que terminam em file_from_PC.txt. Você pode verificar se os possui ou não usando cat:

cat -v file_from_PC.txt
grapesh
fonte
1

Veja também:

Escondendo ^ M no emacs

Tenha cuidado se optar por remover os caracteres ^ M e reenviar para sua equipe. Eles podem ver um arquivo sem retorno de carro posteriormente.

Demosthenex
fonte
0

A solução para mim foi usar a seguinte função elisp encontrada neste artigo do Emacs Wiki .

 (defun dos2unix ()
      "Not exactly but it's easier to remember"
      (interactive)
      (set-buffer-file-coding-system 'unix 't) )

Execute a função M-x dos2unixno buffer e salve o arquivo, tudo ^Mdesaparecerá.

Carlo Rodríguez
fonte