Cosa sono questi ^ M che continuano ad apparire nei miei file in emacs?


157

Quindi penso che possa avere a che fare con textmate, ma lavoriamo in un piccolo team e stiamo riscontrando alcuni problemi con conflitti di file completi di file quasi identici in git perché ogni riga di un ramo ha un ^ M aggiunto ad esso.

Cosa ^Mdovrebbe fare questo misterioso personaggio e da dove potrebbe provenire?

I nostri sviluppatori usano emacs su Windows / Mac, TextMate su Mac, coda su Mac e, occasionalmente, l'editor di testo wp-admin.

Qualcuno ha mai questo problema derivante da uno di quelli?


3
Per quello che vale: cerca "ctrl" invece di ^
Broam,

3
Il problema più grande è che cosa hai intenzione di fare al riguardo? Probabilmente, Emacs non li sta introducendo. Il tuo team dovrebbe decidere se i file devono essere o meno in formato DOS (avere ^ M) o in formato Unix (no ^ M) e applicarlo.
Trey Jackson,

Risposte:


111

In git-config , imposta core.autocrlfsu trueper fare in modo che git converta automaticamente le terminazioni di linea correttamente per la tua piattaforma, ad esempio esegui questo comando per un'impostazione globale:

git config --global core.autocrlf true

6
Penso che questa sia la risposta migliore perché risponde alla domanda nel contesto del PO, vale a dire git.
Neontapir,

Avevo già "[core] \ n autocrlf = true" nel mio file '~ / .gitconfig', ma mi permetteva comunque di 'git clone code.google.com/p/pytomtom ' con '^ m' chars ??? ??
Big Rich

11
Questa risposta si applica SOLO se la tua piattaforma è Windows! Se lavori su Mac / Linux, "true" dovrebbe diventare "input"! Vedere help.github.com/articles/dealing-with-line-endings e qui: stackoverflow.com/questions/9225599/...
K.-Michael Aye

ATTENZIONE: questa risposta quindi corrompe molti altri file quando git "indovina" erroneamente che le terminazioni di linea non sono importanti e devono essere cambiate. Questo è letale per i progetti software in cui questi personaggi esistono in un file di dati (sì, sono stato bruciato da questo, doloroso da rompere). È una soluzione terribile IMHO.
Adam,

@Adam Cosa interrompe esattamente il cambiamento delle terminazioni di linea? Dove hai avuto problemi quando hai lavorato con i dati? Non dovrebbe interessare nulla, è solo un modo diverso di segnare la fine della riga. Mi chiedo solo.
MBI

97

Qualcuno non sta convertendo correttamente i propri caratteri di fine riga .

Presumo che sia la gente di Windows perché amano il loro CRLF. Unix adora LF e Mac adora il CR fino a quando non viene mostrato alla maniera Unix.


12
Per chiarimenti: Mac ha utilizzato CR fino alla versione 10 (OS X), ora utilizza LF.
Mikael S,

34
Sento che il modo in cui Windows è più logico, dal momento che i termini CR e LF vengono dai tempi delle macchine da scrivere. Dovevi fare entrambe le cose: un ritorno a capo per ottenere il punto di battitura all'inizio della riga e un avanzamento riga per scorrere una riga verso il basso. Il modo classico di Mac OS (CR) su una macchina da scrivere continuerebbe a sovrascrivere la stessa riga. Il modo Unix (LF) su una macchina da scrivere produrrebbe un testo sfalsato fino a raggiungere l'intera larghezza della pagina. :)
Altri

114
@Altro: più logico solo nel senso "vogliamo emulare una macchina da scrivere". Non riesco a capire perché questo sia anche lontanamente utile.
Bryan Oakley

29
@Altro lato perché dovresti rappresentare qualcosa con due personaggi quando può essere rappresentato con un personaggio?
Matthew G

13
@Matthew G: Tutto può essere rappresentato in un personaggio, purché molti di noi siano d'accordo su di esso. Significa che dovremmo? Possiamo digitare tutti i nostri messaggi senza punteggiatura, maiuscole e solo ogni frase su una nuova riga e tutti lo capiranno. Significa che dovremmo? Non si tratta di "fare qualcosa perché possiamo". Detto questo, preferisco anche la LF.
Jaffog,

33

^Mè 0x0d, cioè il carattere di ritorno a capo. Se il display è simile

linea 1 ^ M
linea 2 ^ M

quindi il file deve provenire da Windows perché la sequenza di nuova riga standard su Windows è CR LF(0x0d 0x0a ) mentre la sequenza di newline standard è composta esclusivamente da LFUnices.

Se il file provenisse da un sistema operativo Mac OS 9 o precedente, lo vedresti come

riga 1 ^ linea 2 ^ M

perché non ci sarebbero avanzamenti di riga dopo i ritorni a capo.


28

Per far scomparire ^ M in git, digitare:

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

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


1
non cambia nulla.
Vivex,

3
che fa sparire ^ M dal display quando si usa git diff ma è ancora lì
FernandoZ

1
In effetti, mostra solo ^ M come spazio bianco, ma git difftiene comunque conto di ^ M quando confronta i file. Rimuovere questa impostazione con git config --global --unset core.whitespace(da questa discussione ).
miguelmorin,

1
È inoltre possibile omettere il --globalper configurare semplicemente il repository corrente.
Derek Veit,

8

Hanno a che fare con la differenza tra i finali di linea in stile DOS e lo stile Unix. Dai un'occhiata all'articolo di Wikipedia . Potresti essere in grado di trovare uno strumento dos2unix per aiutarti, o semplicemente scrivere un piccolo script per risolverli da solo.

Modifica : ho trovato il seguente codice di esempio Python qui :

string.replace( str, '\r', '' )

3
In Emacs, sarebbe <code> M-: (replace-string "\ r" "") </code>.
Huaiyuan,

7

Sto usando Android Studio (JetBrains IntelliJ IDEA ) su Mac OS e il mio problema era che ^ M ha iniziato a comparire in alcuni file nella mia richiesta pull su GitHub . Ciò che ha funzionato per me è stato cambiare il separatore di riga per un file.

Apri il file desiderato nell'editor vai su File vai su Separatori di linee quindi scegli l'opzione migliore per te (per me era LF - Unix e OS X (\ n) )

Secondo il prossimo articolo questo problema è il risultato di terminazioni di linea confuse tra i sistemi operativi: http://jonathonstaff.com/blog/issues-with-line-endings/

E maggiori informazioni puoi trovare qui: https://www.jetbrains.com/help/idea/configuring-line-separators.html#d84378e48

inserisci qui la descrizione dell'immagine


6

invece di query-replace puoi anche usare Mx delete-trailing-whitespace


questo non ha funzionato per me ... Ho selezionato tutto il testo ed eseguito il comando.
ᐅ devrimbaris,

questo ha funzionato per me. Grazie. @devrimbaris, non è necessario selezionare nulla, è sufficiente eseguire il comando. 'M' è la meta chiave o la chiave di escape. Quindi Mx è fuga quindi x. Quindi digiti delete-trailing-whitespace e premi Invio.
astromax,

5

Inserisci quanto segue nel tuo ~/.emacs(o eqiuvalente)

(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 quindi potresti semplicemente usare M-x dos2unix.


4

^Malla fine della riga in Emacs indica un ritorno a capo (\ r) seguito da un avanzamento riga (\ n). Lo vedrai spesso se una persona modifica i file su Windows (dove end of line è la combinazione di caratteri di ritorno a capo e newline) e li modifichi in Unix o Linux (dove end of line è solo un carattere newline).

La combinazione di personaggi di solito non è dannosa. Se stai usando il controllo del codice sorgente, potresti essere in grado di configurare il formato di checkin dei file di testo in modo che le linee siano magicamente adattate per te. In alternativa, potresti essere in grado di utilizzare i trigger di check-in e check-out che "riparano" automaticamente i file per te. Oppure, potresti semplicemente usare uno strumento come dos2unix per regolare manualmente le cose.


2

Come tutti hanno già detto. È diverso stile di fine linea. MacOSX utilizza terminazioni di linea Unix, ovvero LF (avanzamento di riga).

Windows utilizza sia CR (ritorno a capo) che LF (avanzamento riga) come fine riga. Dal momento che stai usando sia Windows che Mac, ecco da dove deriva il problema.

Se crei un file in Windows e poi lo porti sul Mac, potresti vedere questi ^ M caratteri alla fine delle righe.

Se vuoi rimuoverli puoi farlo molto facilmente in emacs. Basta evidenziare e copiare il carattere ^ M ed eseguire una query di sostituzione ^ M con e il gioco è fatto.

EDIT: alcuni altri link che potrebbero essere di aiuto. http://xahlee.org/emacs/emacs_adv_tips.html

Questo ti aiuta a configurare emacs per usare un particolare tipo di stile di fine linea. http://www.emacswiki.org/emacs/EndOfLineTips


2

Mi sono imbattuto in questo problema qualche tempo fa. La ^ M rappresenta un ritorno a capo, e la ricerca su Ctrl-Q Ctrl-M(questo crea una ^ M letterale) ti permetterà di ottenere un controllo su questo personaggio all'interno di Emacs. Ho fatto qualcosa del genere:

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

2

Se non hai installato l'utilità dos2unix sul tuo sistema, puoi crearne uno tuo per sbarazzarti dei caratteri di fine linea di Windows:

vi ~/dos2unix.bash:

con il seguente contenuto

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

Nel tuo ~ / .bashrc, aggiungi la riga:

alias 'dos2unix=~/dos2unix.bash'

applicando

dos2unix file_from_PC.txt

rimuoverà ^ M caratteri alle righe termina in file_from_PC.txt. Puoi controllare se ne hai o meno usando cat:

cat -v file_from_PC.txt


0

La soluzione per me era usare la seguente funzione elisp contenuta in questo articolo Wiki Emacs .

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

Eseguire la funzione M-x dos2unixsul buffer e salvare il file, tutto ^Mscomparirà.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.