2009-11-30 15 views
113

Quindi penso che possa avere a che fare con il textmate, ma lavoriamo in un piccolo team e stiamo avendo alcuni problemi con conflitti di file completi di file quasi identici in git perché ogni linea di un ramo ha un^M aggiunto ad esso.Cosa sono questi^M che continuano a essere visualizzati nei miei file in emacs?

Che cosa dovrebbe fare questo misterioso personaggio ^M 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 avuto questo problema derivante da uno di quelli?

+3

Per quale vale: cerca "ctrl" invece di^ – Broam

+3

Il problema più grande è, wha hai intenzione di fare al riguardo? Le probabilità sono, Emacs non li sta introducendo. La tua squadra dovrebbe decidere se i file devono essere in formato DOS (avere^M) o nel formato Unix (no^M), e far rispettare ciò. –

risposta

78

Someone is not converting their line-ending characters correctly.

Suppongo che sia la gente di Windows che ama il proprio CRLF. Unix adora LF e Mac ha amato la CR fino a quando non è stato mostrato il modo Unix.

+11

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

+27

Ritengo che il modo in cui Windows è più logico, poiché i termini CR e LF derivano dai giorni 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 in basso. Il modo in cui Mac OS Classic (CR) su una macchina da scrivere continua a sovrascrivere la stessa riga. Il modo Unix (LF) su una macchina da scrivere emetterebbe un testo sfalsato fino a raggiungere l'intera larghezza della pagina. :) – Otherside

+96

@Otheride: più logico solo nel senso "vogliamo emulare una macchina da scrivere". Non riesco a capire perché sia ​​ancora più utile da un punto di vista remoto. –

8

Hanno a che fare con la differenza tra le terminazioni di linea in stile DOS e lo stile Unix. Controlla il Wikipedia article. Potrebbe essere possibile trovare uno strumento dos2unix per aiutare o semplicemente scrivere un piccolo script per correggerli da soli.

Edit: Ho trovato il seguente codice di esempio Python here:

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

In Emacs, questo sarebbe M-: (replace-string "\r" ""). – huaiyuan

+3

In vim può essere fatto con:% s/\ r // g – Parappa

87

In git-config, impostare core.autocrlf a true per fare in modo che git converta automaticamente le terminazioni di linea correttamente per la propria piattaforma.

+4

Penso che questa sia la risposta migliore perché risponde alla domanda nel contesto del OP, vale a dire git. – neontapir

+0

Ho già "[core] \ n autocrlf = true" nel mio file '~/.gitconfig', ma mi consente comunque di 'clonare clone https://code.google.com/p/pytomtom/' con '^ m 'caratteri ????? –

+6

Questa risposta ** SOLO ** si applica se la tua piattaforma è Windows! Se lavori su Mac/Linux, "true" dovrebbe diventare "input"! Vedi https://help.github.com/articles/dealing-with-line-endings e qui: http://stackoverflow.com/questions/9225599/should-git-change-the-ending-of-line-controlm -o-m-at-the-end-of-the-first-l –

22

^M è 0x0d, ovvero il carattere di ritorno a capo. Se lo schermo appare come

 
line 1^M 
line 2^M 

quindi il file deve provenire da Windows, perché la sequenza di ritorno a capo standard su Windows è CRLF (0x0d 0x0a), mentre la sequenza di ritorno a capo standard consiste esclusivamente di LF su Unix.

Se il file era venuto da un sistema Mac OS 9 o versioni precedenti, vedreste come

 
line 1^Mline 2^M 

perché non ci sarebbe nessuna linea alimenta seguendo i ritorni a capo.

+0

Punti bonus per l'utilizzo della parola "Unices". – shiri

3

^M alla fine della riga in Emacs indica un ritorno a capo (\ r) seguito da un avanzamento riga (\ n). Lo vedrai spesso se una persona modifica file su Windows (dove fine riga è la combinazione di caratteri di ritorno a capo e caratteri di nuova riga) e tu modifichi in Unix o Linux (dove fine riga è solo un carattere di nuova riga).

La combinazione di caratteri di solito non è dannosa. Se stai usando il controllo del codice sorgente, potresti essere in grado di configurare il formato di controllo del 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 checkout che automaticamente "correggeranno" i file per te. Oppure, potresti semplicemente utilizzare uno strumento come dos2unix per regolare manualmente le cose.

2

Come tutti hanno menzionato. È uno stile di fine linea diverso. MacOSX utilizza terminazioni di linea Unix, ad esempio LF (avanzamento riga).

Windows utilizza sia CR (ritorno a capo) & LF (avanzamento riga) come una fine riga. Dato che stai usando sia Windows che Mac, da dove proviene il problema.

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

Se si desidera rimuoverli, è possibile eseguire questa operazione molto facilmente in emacs. Basta evidenziare e copiare il carattere^M e fare una query-sostituire^M con e hai fatto.

MODIFICA: Altri collegamenti che potrebbero essere utili. http://xahlee.org/emacs/emacs_adv_tips.html

Questo consente di configurare emacs per utilizzare un particolare tipo di stile di fine riga. http://www.emacswiki.org/emacs/EndOfLineTips

6

invece di query-replace si può anche utilizzare Mx delete-trailing-spazi

+0

questo non ha funzionato per me ... Ho selezionato tutto il testo e ho eseguito il comando. –

+0

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 M-x è escape quindi x. Quindi digiti delete-trailing-whitespace e premi return. – astromax

4

Pot quanto segue nel ~/.emacs (o 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 allora si sarebbe in grado di utilizzare semplicemente M-x dos2unix.

1

Mi sono imbattuto in questo problema qualche tempo fa. Il simbolo^M rappresenta un ritorno a capo e la ricerca su Ctrl-Q Ctrl-M (crea un carattere letterale^M) consente di ottenere un handle su questo personaggio all'interno di Emacs. Ho fatto qualcosa in questo senso:

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

Consulta anche:

Hiding ^M in emacs

fare attenzione se si sceglie di rimuovere i caratteri^M e reinvia alla tua squadra. Potrebbero vedere un file senza ritorni a capo in seguito.

1

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

Aprire il file desiderato nell'editor andare a File andare a Linea separatori andare a quindi scegliere l'opzione migliore per voi (per me è stato LF - Unix e OS X (\ n))

Secondo l'articolo successivo questo problema è il risultato di fine riga confusi tra i sistemi operativi: http://jonathonstaff.com/blog/issues-with-line-endings/

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

enter image description here

Problemi correlati