Que signifie le caractère ^ M dans Vim?


500

Je continue à avoir du ^Mcaractère dans mon vimrc et ça casse ma configuration.


35
BTW c'est une excellente ressource.
Courses de légèreté en orbite le

@LightnessRacesinOrbit - Hm, ça fonctionne aussi maintenant. J'ai retiré mon commentaire en disant que le lien était mort.
ArtOfWarfare

3
Miroir pour le lien @LightnessRacesinOrbit, qui est en panne en ce moment: fifi.org/doc/vim/html/digraph.html#digraph-table
alexpls

4
La saisie :digraphsdans vim montre la table de digrammes à laquelle @LightnessRacesinOrbit est lié.
askewchan

1
Lorsque vous essayez de remplacer ce type de personnage à l'aide de php, essayez ceci, preg_replace('/[\x01]/', ' ' ,$str); cela vous aidera.
Rachel Geller

Réponses:


561

Unix utilise 0xA pour un caractère de nouvelle ligne. Windows utilise une combinaison de deux caractères: 0xD 0xA. 0xD est le caractère de retour chariot. ^Mse trouve être la façon dont vim affiche 0xD (0x0D = 13, M est la 13e lettre de l'alphabet anglais).

Vous pouvez supprimer tous les ^Mcaractères en exécutant ce qui suit:

:%s/^M//g

^Mest entré en maintenant Ctrlet en tapant vsuivi m, puis relâchez Ctrl. Ceci est parfois abrégé en ^V^M, mais notez que vous devez le saisir comme décrit dans la phrase précédente, plutôt que de le taper littéralement.

Cette expression remplacera toutes les occurrences de ^Mpar la chaîne vide (c'est-à-dire rien). Je l'utilise pour me débarrasser des ^Mfichiers copiés de Windows vers Unix (Solaris, Linux, OSX).


9
Juste au cas où vous êtes sur Windows, Ctrl + V sera probablement mappé pour coller. Si c'est le cas, les valeurs par défaut remappent la touche "d'échappement de caractère spécial" à Ctrl + Q.
R. Martinho Fernandes

8
La vraie question est de savoir pourquoi Vim détecte parfois automatiquement les fins de ligne et s'affiche correctement, et parfois non.
Scott

10
Vous verrez le ^Mcaractère si le fichier a des fins de ligne incompatibles. Utilisez la commande fournie par Tomasz, puis tapez en :fileformat={unix|dos|mac}fonction du système d'exploitation que vous ciblez. S'il n'y a que quelques lignes sans le ^Mcaractère, vous le voulez probablement :fileformat=dos. Si vous modifiez des fichiers dans un éditeur autre que vim, assurez-vous qu'il est configuré pour correspondre aux fins de ligne (le Bloc-notes ne le fera pas, mais tout éditeur réputé comme Notepad ++ ou TextMate le fera).
Mikkel Paulson

9
Remarque pour les débutants vi, cette commande doit être saisie manuellement. Le coller simplement dans un terminal ouvert en vicours d' exécution entraînera une erreur "modèle introuvable".
IQAndreas

51
@bluesm que j'avais réellement besoin d'utiliser :%s/\r//gpour remplacer les retours chariot dans mon fichier. Le motif ^ V ^ M est introuvable dans le fichier dans
lequel

139
:%s/\r//g 

a travaillé pour moi aujourd'hui. Mais ma situation a peut-être été légèrement différente.


1
l'option g n'est pas requise, il n'y a qu'une nouvelle ligne par ligne. :%s/\r//suffirait.
frogcoder

7
L'option g peut très bien être requise, car un retour chariot n'est pas nécessairement une nouvelle ligne. Lorsqu'il est ouvert en mode Unix, le retour chariot n'est qu'un autre caractère, et lorsqu'il est ouvert en mode Windows, le retour chariot n'est spécial que immédiatement suivi d'un saut de ligne.
Jonathan Baldwin

65

Pour traduire la nouvelle ligne au lieu de la supprimer:

:%s/\r/\r/g

2
Qu'est-ce que cela est réellement censé faire? Pour moi, on dirait qu'il fait une substitution de semblable à semblable, ce que je ne peux pas imaginer changerait quoi que ce soit. Suis-je en train de manquer quelque chose de spécial sur le fonctionnement de la syntaxe ici?
Platinum Azure

16
@PlatinumAzure Je ne sais pas pourquoi personne n'a jamais pensé à répondre à votre question. \ra un comportement différent dans la partie de recherche par rapport à la partie de remplacement. Voir stackoverflow.com/a/3834303 par exemple.

Ou :%s/^V^M/^V^M/g voir ici
tomd

@TomD Le lien fait référence à la réponse sur laquelle vous commentez.
bzeaman

Pour moi, cela a remplacé les personnages ennuyeux par une nouvelle ligne supplémentaire. La réponse @ dlk5730 a mieux fonctionné pour moi. ie:%s/\r//g
marcusshep

37

Cela signifie probablement que vous avez des retours chariot (différents systèmes d'exploitation utilisent différentes manières de signaler la fin de ligne).

Utilisez dos2unixpour corriger les fichiers ou définir les formats de fichiers dans vim:

set ffs=unix,dos

19

Supposons que votre fichier texte soit - file.txt, puis exécutez cette commande -

dos2unix file.txt 

Il convertit le fichier texte du format dos au format unix.


Marche parfaitement !
robe007

9

J'ai obtenu un fichier texte généré à l'origine sur une machine Windows par le biais d'un utilisateur Mac et je devais l'importer dans une base de données Linux MySQL en utilisant le load data commande.

Bien que VIM affiche le caractère '^ M', rien de ce qui précède ne fonctionnait pour mon problème particulier, les données importaient mais étaient toujours corrompues d'une manière ou d'une autre. La solution a finalement été assez simple (après beaucoup de frustration).

Solution: exécuter dos2unix DEUX FOIS sur le même fichier a fait l'affaire! L'utilisation de la filecommande montre ce qui se passe en cours de route.

$ file 'file.txt'
file.txt: ASCII text, with CRLF, CR line terminators

$ dos2unix 'file.txt'
dos2unix: converting file file.txt to UNIX format ...
$ file 'file.txt'
file.txt: ASCII text, with CRLF line terminators

$ dos2unix 'file.txt'
dos2unix: converting file file.txt to UNIX format ...
$ file 'file.txt'
file.txt: ASCII text

Et la version finale du fichier a été parfaitement importée dans la base de données.


9

Sous Unix, il est probablement plus facile d'utiliser la commande «tr».

cat file1.txt | tr "\r" "\n" > file2.txt

9

Je les ai tous retirés avec sed:

sed -i -e 's/\r//g' <filename>

Pourrait également remplacer par une chaîne ou un caractère différent:

sed -i -e 's/\r/string/g' <filename>

Ces sedcommandes fonctionnent sur la version GNU / Linux de sedmais peuvent nécessiter des ajustements sur les BSD (y compris macOS).




2

Si cela casse votre configuration et que les caractères ^ M sont requis dans les mappages, vous pouvez simplement remplacer les caractères ^ M par <Enter>ou même <C-m>(tous deux tapés comme de simples séquences de caractères, donc 7 et 5 caractères, respectivement).

Il s'agit du seul moyen portable recommandé de stocker des codes clés spéciaux dans les mappages.


2

Dans FreeBSD, vous pouvez effacer ^Mmanuellement en tapant ce qui suit:

:%s/ Ctrl+ V, Puis Ctrl+ M, puis Ctrl+ à Mnouveau.


1

Si vous n'avez pas spécifié un autre fileformatintentionnellement (par exemple, :e ++ff=unixpour un fichier Windows), il est probable que le fichier cible ait des EOL mixtes.

Par exemple, si un fichier a des lignes avec des <CR><NL>fins et d'autres avec des <NL>fins, et fileformatest défini unixautomatiquement par Vim lors de sa lecture, ^M (<CR>)apparaîtra. Dans de tels cas, fileformatsentre en jeu. Voir :help ffspour les détails.


0

J'ai découvert que je polluais des fichiers depuis des semaines en raison du fait que mon instance Homebrew Mvim était configurée pour utiliser filetype = dos. Apporté le changement requis dans .vimrc ....


0

essayez :%s/\^M//au moins cela a fonctionné pour moi.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.