^ M à la fin de chaque ligne dans vim

132

Lorsque j'édite des fichiers source à l'aide de vim et d'autres éditeurs, parfois à la fin de la ligne, j'obtiens ces caractères ^ M à la fin de chaque ligne. Je pense que cela a quelque chose à voir avec l'édition d'un fichier sous Windows puis sous Linux. Comment puis-je supprimer tous ces éléments automatiquement?

DHamrick
la source
18
C'est parce que Windows utilise une séquence de deux caractères (normalement écrite "\ r \ n") pour représenter un saut de ligne, mais UNIX / Linux n'utilise que le deuxième caractère "\ n" pour représenter un saut de ligne. Ainsi, lorsque vous modifiez un fichier texte Windows sur un éditeur Linux, l'éditeur voit des caractères supplémentaires qu'il ne considère pas comme faisant partie des sauts de ligne, il essaie donc de les rendre et ce qui en sort est ^ M.
David Z
13
Il y a un peu plus que ça, David. Vim éditera volontiers un fichier texte avec des fins de ligne DOS sans afficher tous ces ^Ms. La seule indication que vous avez lors de l'édition d'un fichier texte DOS dans Vim est si vous avez %{&ff}dans votre statuslinevaleur d'option. Vim montre ^Mquand le style de fin de ligne est mélangé . Cela signifie que vous avez utilisé un éditeur de texte qui n'est pas aussi averti que Vim, qui n'a pas suivi le style de fin de ligne existant, comme Vim le fera par défaut. Si vous utilisez Vim ou quelque chose d'autre de son calibre sur Windows, vous n'obtiendrez pas des fins de ligne détruites comme ça.
Warren Young

Réponses:

128

En tant que commande, tapez

:%s/^M$//

(Pour obtenir ^ M, appuyez sur ^ V ^ M, où ^ est CTRL sur la plupart des claviers)

Tobias Baaz
la source
62
aussi,:% s / \ r $ // pour éviter les tracas de ^ V ^ M
glenn jackman
8
Ou, sauver un personnage::%s/\r$
sehe
2
@sehe enregistre techniquement 2 caractères :)
Chris
@glennjackman, votre conseil était beaucoup plus simple, car j'avais du mal à obtenir le ^ V + ^ M si cela ne se produisait pas du tout. Tout ce que j'obtenais était le contenu dans le presse-papiers (car ^ V était efficace à chaque fois, malgré mes tentatives répétées avec des stratégies différentes pour les obtenir tous les deux).
itsraghz
86

Un moyen simple de supprimer les fins de ligne DOS est d'utiliser l' ffoption:

:set ff=unix
:wq

Maintenant, votre fichier est revenu à la bonne vieille méthode Unix.

Si vous souhaitez ajouter les fins de ligne DOS (pour garder une imprimante heureuse ou transférer des fichiers avec des amis Windows qui n'ont pas de bons outils), vous pouvez facilement aller dans la direction opposée:

:set ff=dos
:wq
sarnold
la source
8
vim n'a trouvé aucun ^ m, ni \ r, ni aucune des autres fins de ligne, mais cela a fonctionné. Merci :)
SgtPooki
2
Vim n'a trouvé aucun ^ M ou \ r, mais cela a fonctionné pour moi! Merci @sarnold
7ochem
il semblerait que git soit trop stupide pour détecter cela comme un simple changement de caractère. J'ai couru ceci dans Vim et les git diffémissions chaque ligne supprimée et chaque ligne ajoutée: /
Tommy
Tommy, c'est une limitation sur diff, pas sur git.
Spidey
34

Tu peux le faire:

:set fileformats=dos

Il masquera les ^M's, sans toucher au fichier.

jqno
la source
17

Il existe un programme appelé dos2unix qui devrait vous en débarrasser . Windows utilise différents caractères de fin de ligne, c'est pourquoi cela se produit.

Adam Lassek
la source
6

Cela a fonctionné pour moi dans un fichier qui avait tout sur une seule ligne:

Trouvez d'abord tous les matchs

:%s/^M//

(Pour obtenir ^M, appuyez sur ^ V ^ M, où ^ est Ctrlsur la plupart des claviers)

Puis remplacez par des nouvelles lignes

:%s//\r/g

La commande combinée serait:

:%s/^M/\r/g
TheRealKingK
la source
Merci, je me suis demandé comment entrer réellement Ctrl-M dans rechercher-remplacer!
Roboprog
2

J'ai tendance à parcourir les fichiers affligés fromdosavant de les rouvrir. fromdosfait partie du package tofrodos .

Ted Percival
la source
1

L'origine du problème peut provenir d'un transfert FTP. Lorsque vous envoyez ces fichiers par FTP d'une boîte à une autre, assurez-vous d'utiliser les transferts ASCII. Utilisez la commande «ASC».

Spencer Ruport
la source
0
" put this in your ~/.vimrc file and :source ~/.vimrc
" then you can do: Dos2Unix
" dos2unix ^M
fun! Dos2unixFunction()
    let _s=@/
    let l = line(".")
    let c = col(".")
    try
        set ff=unix
        w!
        "%s/\%x0d$//e
    catch /E32:/
        echo "Sorry, first save the file."
    endtry
    let @/=_s
    call cursor(l, c)
endfun
com! Dos2Unix keepjumps call Dos2unixFunction()
SergioAraujo
la source
0

mcedit: shift + f2, définir le format unix (LF), ok

Vasily Chapaev
la source