Que signifie le caractère ^M dans Vim?
Je continue à obtenir ^M
caractère dans mon vimrc et il casse ma configuration.
15 réponses
Unix utilise 0xA pour un caractère de retour à la ligne. Windows utilise une combinaison de deux caractères: 0xD 0xA. 0xD est le caractère de retour chariot. ^M
se trouve être la façon dont vim affiche 0xD ( 0x0D = 13, M est la 13ème lettre de l'alphabet anglais).
Vous pouvez supprimer tous les caractères ^M
en exécutant les opérations suivantes:
:%s/^M//g
Où ^M
est entré en maintenant Ctrl et taper v, suivie par m, puis en relâchant Ctrl. C'est parfois abrégé en ^V^M
, mais notez que vous devez l'entrer comme décrit dans la phrase précédente, au lieu de le taper littéralement.
Cette expression remplacera toutes les occurrences de ^M
par la chaîne vide (c'est-à-dire rien). Je l'utilise pour me débarrasser de ^M
dans les fichiers copiés de Windows vers Unix (Solaris, Linux, OSX).
:%s/\r//g
A travaillé pour moi aujourd'hui. Mais ma situation était légèrement différente.
Pour traduire la nouvelle ligne au lieu de la supprimer:
:%s/\r/\r/g
Cela signifie probablement que vous avez des retours chariot (différents systèmes d'exploitation utilisent différentes façons de signaler la fin de la ligne).
Utiliser dos2unix
pour réparer les fichiers ou définir les formats de fichiers dans vim:
set ffs=unix,dos
Disons que votre fichier texte est-file.txt, puis exécutez cette commande -
dos2unix file.txt
Il convertit le fichier texte de dos au format unix.
Dans Unix, il est probablement plus facile d'utiliser la commande 'tr'.
cat file1.txt | tr "\r" "\n" > file2.txt
Je les ai tous enlevés avec sed:
sed -i -e 's/\r//g'
Pourrait également remplacer par une chaîne ou un caractère différent:
sed -i -e 's/\r/string/g'
J'ai obtenu un fichier texte généré à l'origine sur une Machine Windows par le biais D'un utilisateur Mac et j'ai dû l'importer dans une base de données MySQL Linux en utilisant la commande load data
.
Bien que VIM ait affiché le caractère '^M', aucun des éléments ci-dessus ne fonctionnait pour mon problème particulier, les données étaient importées mais étaient toujours corrompues d'une manière ou d'une autre. La solution était assez facile à la fin (après beaucoup de frustration).
Solution:
Exécution dos2unix
deux fois sur le même fichier a fait l'affaire! Utilisation du file
commande montre ce qui se passe le long du chemin.
$ 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 importé parfaitement dans la base de données.
Vous pouvez résoudre ce problème dans vim en utilisant
:1,$s/^V^M//g
Où ^ est le caractère de contrôle.
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>
(les deux tapés comme des séquences de caractères simples, donc 7 et 5 caractères, respectivement).
C'est la seule façon recommandée et portable de stocker des keycodes spéciaux dans les mappages
Sous FreeBSD, vous pouvez effacer le ^M
manuellement en tapant ce qui suit:
:%s/
Ctrl+V, puis Ctrl+M, puis Ctrl+M nouveau.
C'est la seule chose qui a fonctionné dans mon cas:
:e ++ff=dos
:wq
J'ai découvert que je pollue des fichiers depuis des semaines en raison du fait que mon instance Homebrew Mvim a été définie pour utiliser filetype = dos. Fait le changement requis dans .vimrc....
Si vous n'avez pas spécifié intentionnellement un fileformat
différent (par exemple, :e ++ff=unix
pour un fichier Windows), il est probable que le fichier cible a des EOLs mixtes.
Par exemple, si un fichier a des lignes avec des terminaisons <CR><NL>
et d'autres avec
<NL>
Terminaisons, et fileformat
est défini sur unix
automatiquement par Vim lors de la lecture, ^M (<CR>)
apparaîtra.
Dans de tels cas, fileformats
entre en jeu. Voir :help ffs
pour les détails.