^ M am Ende jeder Zeile in vim


132

Wenn ich Quelldateien mit vim und anderen Editoren bearbeite, werden manchmal am Ende der Zeile diese ^ M-Zeichen am Ende jeder Zeile angezeigt. Ich denke, dass es etwas mit dem Bearbeiten einer Datei in Windows und dann unter Linux zu tun hat. Wie kann ich all diese automatisch entfernen?


18
Dies liegt daran, dass Windows eine zweistellige Sequenz (normalerweise "\ r \ n") verwendet, um einen Zeilenumbruch darzustellen, UNIX / Linux jedoch nur das zweite Zeichen "\ n" verwendet, um einen Zeilenumbruch darzustellen. Wenn Sie also eine Windows-Textdatei in einem Linux-Editor bearbeiten, sieht der Editor zusätzliche Zeichen, die nicht als Teil der Zeilenumbrüche betrachtet werden. Daher versucht er, sie zu rendern, und es wird ^ M ausgegeben.
David Z

13
Es steckt noch ein bisschen mehr dahinter, David. Vim bearbeitet gerne eine Textdatei mit DOS-Zeilenenden, ohne alle diese ^Ms anzuzeigen. Der einzige Hinweis, den Sie beim Bearbeiten einer DOS-Textdatei in Vim haben, ist, wenn Sie %{&ff}Ihren statuslineOptionswert angegeben haben. Vim zeigt an, ^Mwann der Zeilenendstil gemischt wird . Dies bedeutet, dass Sie einen Texteditor verwendet haben, der nicht so versiert ist wie Vim, der nicht dem vorhandenen Zeilenendstil folgt, wie dies Vim standardmäßig tut. Wenn Sie Vim oder etwas anderes seines Kalibers unter Windows verwenden, werden Sie keine solchen zerstörten Zeilenenden erhalten.
Warren Young

Antworten:


128

Geben Sie als Befehl Folgendes ein

:%s/^M$//

(Um ^ M zu erhalten, drücken Sie ^ V ^ M, wobei ^ auf den meisten Tastaturen STRG ist.)


62
auch:% s / \ r $ // um den Ärger mit ^ V ^ M zu vermeiden
Glenn Jackman

8
Oder speichern Sie einen Charakter::%s/\r$
sehe

2
@sehe speichert technisch 2 Zeichen :)
Chris

@glennjackman, dein Tipp war viel einfacher, da ich mich bemüht hatte, das ^ V + ^ M zu bekommen, wenn es überhaupt nicht passiert wäre. Alles, was ich bekam, war der Inhalt in der Zwischenablage (da ^ V jedes Mal wirksam war, trotz meiner wiederholten Versuche mit unterschiedlichen Strategien, beide zu bekommen).
itsraghz

86

Eine einfache Möglichkeit, die DOS-Zeilenenden zu entfernen, ist die Verwendung der folgenden ffOption:

:set ff=unix
:wq

Jetzt ist Ihre Datei wieder auf dem guten alten Unix-Weg.

Wenn Sie die DOS-Zeilenenden hinzufügen möchten (um einen Drucker zufrieden zu stellen oder Dateien mit Windows-Freunden zu übertragen, die keine netten Tools haben), können Sie ganz einfach in die entgegengesetzte Richtung gehen:

:set ff=dos
:wq

8
vim fand kein ^ m oder \ r oder eines der anderen Zeilenenden, aber das funktionierte. Danke :)
SgtPooki

2
Vim würde kein ^ M oder \ r finden, aber das hat bei mir funktioniert! Danke @sarnold
7ochem

Es scheint, dass Git zu dumm ist, um dies als einzelne Zeichenänderung zu erkennen. Ich habe dies in Vim ausgeführt und die git diffShows jede Zeile gelöscht und jede Zeile hinzugefügt: /
Tommy

Tommy, das ist eine Einschränkung diff, nicht eine git.
Spidey

34

Du kannst das:

:set fileformats=dos

Die ^M's werden ausgeblendet, ohne die Datei zu berühren.



6

Dies funktionierte für mich in einer Datei, in der alles in einer Zeile stand:

Finde zuerst alle Übereinstimmungen

:%s/^M//

(Um zu erhalten ^M, drücken Sie ^ V ^ M, wobei ^ Ctrlauf den meisten Tastaturen steht.)

Dann durch Zeilenumbrüche ersetzen

:%s//\r/g

Kombinierter Befehl wäre:

:%s/^M/\r/g

Vielen Dank, ich habe mich gefragt, wie ich Strg-M tatsächlich in Suchen-Ersetzen eingeben soll!
Roboprog

2

Ich neige dazu, betroffene Dateien durchzugehen, fromdosbevor ich sie wieder öffne . fromdosist Teil des Tofrodos- Pakets.


1

Der Grund für das Problem könnte eine FTP-Übertragung gewesen sein. Wenn Sie diese Dateien von einer Box zur anderen per FTP übertragen, stellen Sie sicher, dass Sie ASCII-Übertragungen verwenden. Verwenden Sie den Befehl "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()

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.