^ 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?


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)


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

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.



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

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 .


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».


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()

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.