2009-11-30 11 views
113

Así que creo que puede tener que ver con el compañero de texto, pero trabajamos en un pequeño equipo y tenemos algunos problemas con los archivos completos de archivos casi idénticos en git porque cada línea de una rama tiene una^M añadida.¿Cuáles son estas^M que siguen apareciendo en mis archivos en emacs?

¿Qué se supone que debe hacer este misterioso personaje ^M, y de dónde podría provenir?

Nuestros desarrolladores utilizan emacs en Windows/Mac, TextMate en Mac, coda en Mac y ocasionalmente el editor de texto wp-admin.

¿Alguien ha tenido este problema proveniente de uno de esos?

+3

Por lo vale la pena: buscar "ctrl" en lugar de^ – Broam

+3

El problema más grande es, wha ¿Vas a hacer al respecto? Lo más probable es que Emacs no los presente. Su equipo debe decidir si los archivos deben ser de formato DOS (tienen^M) o formato Unix (no^M), y hacer cumplir eso. –

Respuesta

78

Someone is not converting their line-ending characters correctly.

Supongo que es la gente de Windows, ya que aman su CRLF. Unix ama LF y Mac amaba CR hasta que se mostró el camino de Unix.

+11

Para aclarar: Mac usó CR hasta la versión 10 (OS X), ahora usa LF. –

+27

Creo que el modo Windows es más lógico, ya que los términos CR y LF vienen de la época de las máquinas de escribir. Debes hacer ambas cosas: un retorno de carro para obtener el punto de tipeo al comienzo de la línea y un avance de línea para desplazarte una línea hacia abajo. El modo Mac OS Classic (CR) en una máquina de escribir simplemente sobrescribiría la misma línea. La forma Unix (LF) en una máquina de escribir generará texto escalonado hasta que alcance el ancho completo de la página. :) – Otherside

+96

@OtherSide: más lógico solo en el sentido "queremos emular una máquina de escribir". No puedo comenzar a entender por qué eso es remotamente útil. –

8

Tienen que ver con la diferencia entre los finales de línea de estilo DOS y el estilo Unix. Consulte el Wikipedia article. Es posible que pueda encontrar una herramienta dos2unix para ayudar, o simplemente escriba un pequeño script para solucionarlo usted mismo.

Editar: He encontrado el siguiente ejemplo de código Python here:

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

En Emacs, eso sería M-: (replace-string "\r" ""). – huaiyuan

+3

En vim se puede hacer con:% s/\ r // g – Parappa

87

En git-config, configure core.autocrlf en true para hacer que git convierta automáticamente los finales de línea correctamente para su plataforma.

+4

Creo que esta es la mejor respuesta porque responde a la pregunta en el contexto de la OP, es decir, git. – neontapir

+0

Ya tenía "[core] \ n autocrlf = true" en mi archivo '~/.gitconfig', pero aún así me permití 'git clone https://code.google.com/p/pytomtom/' con '^ m 'chars ????? –

+6

¡Esta respuesta ** SOLO ** se aplica si su plataforma es Windows! ¡Si trabajas en Mac/Linux, "verdadero" debería convertirse en "entrada"! Consulte https://help.github.com/articles/dealing-with-line-endings y aquí: http://stackoverflow.com/questions/9225599/should-git-change-the-ending-of-line-controlm -o-m-at-the-end-of-the-first-l –

22

^M es 0x0d, es decir, el carácter de retorno de carro. Si la pantalla se ve como

 
line 1^M 
line 2^M 

entonces el archivo debe haber venido de Windows, ya que la secuencia de salto de línea estándar en Windows es CRLF (0x0d 0x0a) mientras que la secuencia de línea nueva norma consiste únicamente en LF en sistemas Unix.

Si el archivo había venido de un sistema Mac OS 9 o anterior, que se vería como

 
line 1^Mline 2^M 

porque no habría ninguna línea alimenta siguiendo los retornos de carro.

+0

Puntos de bonificación por usar la palabra "Unices". – shiri

3

^M al final de la línea en Emacs indica un retorno de carro (\ r) seguido de un salto de línea (\ n). A menudo verá esto si una persona edita archivos en Windows (donde el final de la línea es la combinación de retorno de carro y caracteres de nueva línea) y edita en Unix o Linux (donde el final de la línea es solo un carácter de nueva línea).

La combinación de caracteres no suele ser perjudicial. Si está utilizando el control de fuente, puede configurar el archivo de texto en el formato para que las líneas se ajusten mágicamente para usted. Alternativamente, es posible que pueda utilizar desencadenantes de entrada y salida que automáticamente "arreglen" los archivos por usted. O bien, puede usar una herramienta como dos2unix para ajustar manualmente las cosas.

2

Como todo el mundo ha mencionado. Es un estilo de terminación de línea diferente. MacOSX usa terminaciones de línea Unix, es decir, LF (alimentación de línea).

Windows usa CR (retorno de carro) & LF (avance de línea) como final de línea. Ya que está usando tanto Windows como Mac, de ahí viene el problema.

Si crea un archivo en Windows y luego lo trae al mac, puede ver estos^M caracteres al final de las líneas.

Si desea eliminarlos, puede hacerlo fácilmente en emacs. Solo resalta y copia el carácter^M y haz una consulta-reemplaza^M con y listo.

EDITAR: Algunos otros enlaces que pueden ser de ayuda. http://xahlee.org/emacs/emacs_adv_tips.html

Éste le ayuda a configurar emacs para usar un tipo particular de estilo de final de línea. http://www.emacswiki.org/emacs/EndOfLineTips

6

lugar de consulta de sustituir también puede utilizar Mx delete-arrastrar-espacio en blanco

+0

esto no funcionó para mí ... He seleccionado todo el texto y ejecuté el comando. –

+0

esto funcionó para mí. Gracias. @devrimbaris, no necesita seleccionar nada, simplemente ejecuta el comando. 'M' es la tecla meta, o la tecla de escape. Entonces M-x es escape luego x. Luego, escribe delete-trailing-whitespace y pulsa return. – astromax

4

Pot lo siguiente en su ~/.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 ""))) 

y entonces sería capaz de simplemente use M-x dos2unix.

1

Me encontré con este problema hace un tiempo. El^M representa un retorno de carro, y la búsqueda en Ctrl-Q Ctrl-M (Esto crea un literal^M) le permitirá obtener un control sobre este personaje dentro de Emacs. Hice algo en este sentido:

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

Consulte también:

Hiding ^M in emacs

tener cuidado si decide eliminar los caracteres^M y volver a presentar a su equipo. Es posible que vean un archivo sin retornos de carro después.

1

estoy usando Android Studio (JetBrains IntelliJ IDEA ) en Mac OS y mi problema era que M^comenzó a aparecer en algunos archivos en mi solicitud de extracción de GitHub. Lo que funcionó para mí fue cambiar el separador de línea para un archivo.

Abrir el archivo deseado en el editor de ir a Archivo ir a Línea Separadores ir a A continuación, elija la mejor opción para usted (para mí fue LF - Unix y OS X (\ n))

acuerdo con el siguiente artículo este problema es el resultado de los finales de línea confusas entre sistemas operativos: http://jonathonstaff.com/blog/issues-with-line-endings/

y más información se puede encontrar aquí: https://www.jetbrains.com/help/idea/configuring-line-separators.html#d84378e48

enter image description here

Cuestiones relacionadas