web-dev-qa-db-fra.com

Quels sont ces ^ M qui continuent à apparaître dans mes fichiers dans emacs?

Je pense donc que cela a peut-être un rapport avec textmate, mais nous travaillons dans une petite équipe et nous rencontrons des problèmes avec des conflits de fichiers complets dans des fichiers presque identiques dans git, car chaque ligne d’une branche a un ^ M ajouté.

Quel est ce mystérieux ^M personnage censé faire, et d'où pourrait-il provenir?

Nos développeurs utilisent emacs sur Windows/Mac, TextMate sur Mac, Coda sur Mac et occasionnellement l'éditeur de texte wp-admin.

Quelqu'un a-t-il déjà eu ce problème issu d'un de ceux-là?

140
Neil Sarkar

Quelqu'un ne convertit pas correctement les caractères de fin de ligne .

Je suppose que ce sont les gens Windows comme ils aiment leur CRLF. Unix aime LF et Mac a aimé CR jusqu'à ce qu'il soit montré à la manière Unix.

92
Broam

Dans git-config , définissez core.autocrlf to true pour que git convertisse automatiquement les fins de ligne correctement pour votre plate-forme, par exemple. exécutez cette commande pour un paramètre global:

git config --global core.autocrlf true
98
Josh Lee

^M est 0x0d, c’est-à-dire le caractère de retour chariot. Si votre écran ressemble à

 ligne 1 ^ M 
 ligne 2 ^ M 

alors le fichier doit provenir de Windows car la séquence de nouvelle ligne sous Windows est CRLF (0x0d 0x0a) alors que la séquence standard de nouvelle ligne consiste uniquement en LF sur Unices.

Si le fichier provenait d’un système Mac OS 9 ou antérieur, vous le verriez comme

 line 1 ^ Mline 2 ^ M 

car il n'y aurait pas de sauts de ligne après les retours à la ligne.

29
Sinan Ünür

Pour faire disparaître le ^ M dans git, tapez:

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

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

17
bonif

Ils ont à voir avec la différence entre les fins de ligne de style DOS et le style Unix. Découvrez le article Wikipedia . Vous pourrez peut-être trouver un outil dos2unix pour vous aider ou simplement écrire un petit script pour les réparer vous-même.

Edit : J'ai trouvé ce qui suit Python exemple ici :

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

au lieu de query-replace, vous pouvez également utiliser M-x delete-trailing-whitespace

6
kaineer

J'utilise Android Studio (JetBrains IntelliJ IDEA ) le Mac OS et mon problème était que ^ M a commencé à apparaître dans certains fichiers de ma demande d'extraction sur GitHub . Ce qui a fonctionné pour moi a été de changer le séparateur de ligne pour un fichier.

Ouvrez le fichier souhaité dans l'éditeur allez à Fichier allez à Les séparateurs de lignes puis choisissent la meilleure option pour vous (pour moi, c'était LF - Unix et OS X (\ n) )

Selon le prochain article, ce problème est dû à la confusion des fins de ligne entre les systèmes d'exploitation: http://jonathonstaff.com/blog/issues-with-line-endings/

Et plus d'informations, vous pouvez trouver ici: https://www.jetbrains.com/help/idea/configuring-line-separators.html#d84378e48

enter image description here

6
CookieMonster

Pot le suivant dans ton ~/.emacs (ou équivalent)

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

et vous pourrez alors simplement utiliser M-x dos2unix.

4
Jakub Narębski

^M à la fin de la ligne dans Emacs indique un retour chariot (\ r) suivi d’un saut de ligne (\ n). Vous verrez souvent cela si une personne modifie des fichiers sous Windows (où fin de ligne correspond à la combinaison de retour à la ligne et de caractères de nouvelle ligne) et que vous modifiez sous Unix ou Linux (où fin de ligne correspond à un caractère de nouvelle ligne).

La combinaison de caractères n'est généralement pas nuisible. Si vous utilisez le contrôle de source, vous pourrez peut-être configurer le format d'archivage de fichier texte afin que les lignes soient ajustées comme par magie. Vous pouvez également utiliser des déclencheurs d’archivage et de vérification qui "corrigent" automatiquement les fichiers pour vous. Ou, vous pouvez simplement utiliser un outil comme dos2unix pour ajuster les choses manuellement.

4
atk

Comme tout le monde l'a mentionné. C'est un style de fin de ligne différent. MacOSX utilise des fins de ligne Unix, c’est-à-dire LF (saut de ligne).

Windows utilise les deux CR (retour à la ligne) & LF (saut de ligne) comme fin de ligne. Puisque vous utilisez à la fois Windows et Mac, c'est de là que vient le problème.

Si vous créez un fichier dans Windows puis que vous le déposez sur le Mac, vous risquez de voir ces ^ M caractères à la fin des lignes.

Si vous voulez les supprimer, vous pouvez le faire très facilement dans emacs. Mettez en surbrillance et copiez simplement le caractère ^ M et effectuez une requête, remplacez ^ M par et vous avez terminé.

EDIT: Quelques autres liens qui pourraient être utiles. http://xahlee.org/emacs/emacs_adv_tips.html

Celui-ci vous aide à configurer emacs pour utiliser un type particulier de style de fin de ligne. http://www.emacswiki.org/emacs/EndOfLineTips

2
Matt

J'ai rencontré ce problème il y a quelque temps. Le ^ M représente un retour chariot et recherche sur Ctrl-Q Ctrl-M _ (Cela crée un littéral ^ M) vous permettra d’obtenir une description de ce personnage dans Emacs. J'ai fait quelque chose dans ce sens:

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

Voir également:

Cacher ^ M dans emacs

Faites attention si vous choisissez de supprimer les caractères ^ M et de les renvoyer à votre équipe. Ils peuvent voir un fichier sans retour chariot après.

1
Demosthenex

Si vous n'avez pas l'utilitaire dos2unix installé sur votre système, vous pouvez créer le vôtre pour supprimer les caractères de fin Windows:

vi ~/dos2unix.bash:

avec le contenu suivant

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

Dans votre ~/.bashrc, ajoutez la ligne:

alias 'dos2unix=~/dos2unix.bash'

Appliquer

dos2unix file_from_PC.txt

supprimera ^ M caractères aux extrémités des lignes dans file_from_PC.txt. Vous pouvez vérifier si vous en avez ou non en utilisant cat:

cat -v file_from_PC.txt
1
grapesh

La solution pour moi était d'utiliser la fonction elisp suivante trouvée dans this Article du wiki d'Emacs .

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

Exécute la fonction M-x dos2unix sur le tampon et enregistrez le fichier, tous ^M disparaîtra.

0
Carlo Rodríguez