¿Qué son estas ^ M que siguen apareciendo en mis archivos en emacs?

157

Así que creo que puede tener que ver con textmate, pero trabajamos en un equipo pequeño y estamos teniendo algunos problemas con conflictos de archivos completos de archivos casi idénticos en git porque cada línea de una rama tiene un ^ M agregado.

¿Qué se ^Msupone que debe hacer este misterioso personaje y de dónde podría venir?

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

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

Neil Sarkar
fuente
3
Para lo que vale: busque "ctrl" en lugar de ^
Broam
3
El problema más grande es, ¿qué vas a hacer al respecto? Lo más probable es que Emacs no los presente. Su equipo debe decidir si los archivos deben estar en formato DOS (tener ^ M) o en formato Unix (no ^ M), y hacer cumplir eso.
Trey Jackson el

Respuestas:

111

En git-config , configure core.autocrlfpara truehacer que git convierta automáticamente los finales de línea correctamente para su plataforma, por ejemplo, ejecute este comando para una configuración global:

git config --global core.autocrlf true
Josh Lee
fuente
66
Creo que esta es la mejor respuesta porque responde la pregunta en el contexto del OP, es decir, git.
neontapir
Ya tenía "[core] \ n autocrlf = true" en mi archivo '~ / .gitconfig', pero todavía me dejaba 'git clone code.google.com/p/pytomtom ' con caracteres '^ m' ??? ??
Big Rich
11
¡Esta respuesta SOLO se aplica si su plataforma es Windows! Si trabaja en Mac / Linux, "verdadero" debería convertirse en "entrada". Consulte help.github.com/articles/dealing-with-line-endings y aquí: stackoverflow.com/questions/9225599/…
K.-Michael Aye
ADVERTENCIA: esta respuesta corrompe muchos otros archivos cuando git "adivina" incorrectamente que los finales de línea no son importantes y deben cambiarse. Esto es letal para proyectos de software en los que estos personajes existen en un archivo de datos (sí, esto me ha quemado, me duele mucho deshacerlo). Es una solución terrible en mi humilde opinión.
Adam
@ Adam ¿Qué es exactamente romper el cambio de terminaciones de línea? ¿Dónde tuvo problemas al trabajar con datos? No debería afectar nada, es solo una forma diferente de marcar el final de la fila. Solo me pregunto.
MBI
97

Alguien no está convirtiendo sus caracteres de final de línea correctamente .

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

Broam
fuente
12
Para aclarar: Mac usó CR hasta la versión 10 (OS X), ahora usa LF.
Mikael S
34
Siento que la forma de Windows es más lógica, ya que los términos CR y LF provienen de los días de las máquinas de escribir. Tuviste que hacer ambas cosas: un retorno de carro para obtener el punto de escritura al comienzo de la línea y un avance de línea para desplazar una línea hacia abajo. La forma clásica de Mac OS (CR) en una máquina de escribir seguiría sobrescribiendo la misma línea. La forma Unix (LF) en una máquina de escribir generaría texto escalonado hasta que alcanzara el ancho completo de la página. :)
Otherside el
114
@Otro lado: más lógico solo en el sentido de "queremos emular una máquina de escribir". No puedo comenzar a entender por qué eso ya es remotamente útil.
Bryan Oakley
29
@Otro lado, ¿por qué representaría algo con dos caracteres cuando se puede representar con un carácter?
Matthew G
13
@ Matthew G: Todo se puede representar en un personaje, siempre y cuando muchos de nosotros estemos de acuerdo. ¿Eso significa que deberíamos? Podemos escribir todos nuestros mensajes sin puntuación, mayúsculas y solo cada oración en una nueva línea, y todos lo entenderían. ¿Eso significa que deberíamos? No se trata de "hacer algo porque podemos". Dicho esto, prefiero el LF también.
jaffog
33

^Mes 0x0ddecir, el carácter de retorno de carro. Si su pantalla se ve así

línea 1 ^ M
línea 2 ^ M

entonces el archivo debe provenir de Windows porque la secuencia de nueva línea estándar en Windows es CR LF( 0x0d 0x0a), mientras que la secuencia de nueva línea estándar consiste únicamente LFen Unices.

Si el archivo provenía de un sistema Mac OS 9 o anterior, lo vería como

línea 1 ^ Mline 2 ^ M

porque no habría saltos de línea después de los retornos de carro.

Sinan Ünür
fuente
28

Para hacer que ^ M desaparezca en git, escriba:

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
fuente
1
No cambia nada.
Vivex
3
eso solo hace que ^ M desaparezca de la pantalla cuando se usa git diff pero todavía está allí
FernandoZ
1
De hecho, solo muestra la ^ M como espacio en blanco, pero git diffaún tiene en cuenta la ^ M al comparar archivos. Elimine esta configuración con git config --global --unset core.whitespace(de este hilo ).
miguelmorin
1
También puede omitir --globalpara configurar el repositorio actual.
Derek Veit
8

Tienen que ver con la diferencia entre las terminaciones de línea de estilo DOS y el estilo Unix. Mira el artículo de Wikipedia . Es posible que pueda encontrar una herramienta dos2unix para ayudar, o simplemente escribir un pequeño script para solucionarlo usted mismo.

Editar : encontré el siguiente código de muestra de Python aquí :

string.replace( str, '\r', '' )
Parappa
fuente
3
En Emacs, eso sería <code> M-: (replace-string "\ r" "") </code>.
huaiyuan 02 de
7

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

Abra el archivo deseado en el editor, vaya a Archivo, vaya a Separadores de línea y luego elija la mejor opción para usted (para mí fue LF - Unix y OS X (\ n) )

Según el siguiente artículo, este problema es el resultado de terminaciones de línea confusas entre sistemas operativos: http://jonathonstaff.com/blog/issues-with-line-endings/

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

ingrese la descripción de la imagen aquí

CookieMonster
fuente
6

en lugar de query-replace, también puede usar Mx delete-trailing-whitespace

kaineer
fuente
esto no funcionó para mí ... He seleccionado todo el texto y ejecuté el comando.
ᐅ devrimbaris
Esto funcionó para mí. Gracias. @devrimbaris, no necesita seleccionar nada, simplemente ejecuta el comando. 'M' es la meta clave, o la tecla de escape. Entonces Mx es escape, entonces x. Luego escribes delete-trailing-whitespace y presionas return.
astromax
5

Pote lo siguiente en tu ~/.emacs(o equivalente)

(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 luego podrías simplemente usarlo M-x dos2unix.

Jakub Narębski
fuente
4

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

La combinación de caracteres generalmente no es dañina. Si está utilizando el control de fuente, es posible que pueda configurar el formato de registro del archivo de texto para que las líneas se ajusten mágicamente por usted. Alternativamente, puede utilizar los desencadenadores de ingreso y salida que automáticamente "arreglarán" los archivos por usted. O bien, puede usar una herramienta como dos2unix para ajustar manualmente las cosas.

atk
fuente
2

Como todos han mencionado. Es un estilo de final de línea diferente. MacOSX utiliza finales de línea Unix, es decir, LF (avance de línea).

Windows usa CR (retorno de carro) y LF (avance de línea) como final de línea. Dado que está utilizando Windows y Mac, de ahí proviene el problema.

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

Si desea eliminarlos, puede hacerlo fácilmente en emacs. Simplemente resalte y copie el carácter ^ M y realice una consulta-reemplace ^ M con y ya está.

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

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

Mate
fuente
2

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 ^ M literal) 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]
nedblorf
fuente
2

Si no tiene la utilidad dos2unix instalada en su sistema, puede crear la suya propia para deshacerse de los caracteres finales de Windows:

vi ~/dos2unix.bash:

con el siguiente contenido

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

En su ~ / .bashrc, agregue la línea:

alias 'dos2unix=~/dos2unix.bash'

Aplicando

dos2unix file_from_PC.txt

eliminará ^ M caracteres en las líneas termina en file_from_PC.txt. Puede verificar si los tiene o no utilizando cat:

cat -v file_from_PC.txt
uva
fuente
1

Ver también:

Ocultar ^ M en emacs

Tenga cuidado si elige eliminar los caracteres ^ M y volver a enviarlos a su equipo. Pueden ver un archivo sin retornos de carro después.

Demosthenex
fuente
0

La solución para mí fue utilizar la siguiente función elisp que se encuentra en este artículo de Emacs Wiki .

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

Ejecute la función M-x dos2unixen el búfer y guarde el archivo, todo ^Mdesaparecerá.

Carlo Rodríguez
fuente