Que signifie le caractère ^ M dans Vim?

500

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

Max
la source
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).

Tomasz Stanczak
la source
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.

dlk5730
la source
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
Mori
la source
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
cnicutar
la source
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.

akritaag
la source
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.

Anthony Palmer
la source
9

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

cat file1.txt | tr "\r" "\n" > file2.txt
Irving Rabin
la source
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).

Freedom_Ben
la source
4

Vous pouvez résoudre ce problème dans vim en utilisant

:1,$s/^V^M//g

où ^ est le caractère de contrôle.

Scott C Wilson
la source
2
Cela n'explique pas ce qui ^Mest.
Courses de légèreté en orbite le
2
Il ne demande pas vraiment ce que c'est, il demande comment y remédier. Il s'agit d'un caractère de retour chariot de DOS.
Scott C Wilson
3
Je sais ce que c'est. Le titre de la question est "Que signifie le caractère ^ M dans Vim".
Courses de légèreté en orbite le
3

C'est la seule chose qui a fonctionné dans mon cas:

:e ++ff=dos

:wq

Sardeep Lakhera
la source
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.

sehe
la source
2

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

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

Victor Ong
la source
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.

ebk
la source
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 ....

nichg
la source
0

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

xuc
la source