^ M na końcu każdej linii w vimie

133

Kiedy edytuję pliki źródłowe przy użyciu vima i innych edytorów, czasami na końcu linii pojawiają się znaki ^ M na końcu każdej linii. Myślę, że ma to coś wspólnego z edycją pliku w oknach, a potem w Linuksie. Jak mogę usunąć je wszystkie automatycznie?

DHamrick
źródło
18
Dzieje się tak, ponieważ system Windows używa dwuznakowej sekwencji (zwykle zapisywanej jako „\ r \ n”) do reprezentowania podziału wiersza, ale UNIX / Linux używa tylko drugiego znaku „\ n” do reprezentowania podziału wiersza. Więc kiedy edytujesz plik tekstowy Windows w edytorze Linuksa, edytor widzi dodatkowe znaki, których nie bierze pod uwagę jako część podziałów wierszy, więc próbuje je wyrenderować i wychodzi ^ M.
David Z,
13
Jest w tym coś więcej, David. Vim szczęśliwie edytuje plik tekstowy z końcówkami linii DOS bez pokazywania tych wszystkich ^M. Jedynym wskazaniem masz podczas edycji pliku tekstowego DOS w vim jest, jeśli masz %{&ff}w swojej statuslinewartości opcji. Vim pokazuje, ^Mkiedy styl zakończenia linii jest mieszany . Oznacza to, że użyłeś edytora tekstu, który nie jest tak sprytny jak Vim, który nie podążał za istniejącym stylem zakończenia linii, jak Vim domyślnie. Jeśli używasz Vima lub czegoś innego tego kalibru w systemie Windows, nie dostaniesz takich zepsutych zakończeń linii.
Warren Young

Odpowiedzi:

128

Jako polecenie wpisz

:%s/^M$//

(Aby uzyskać ^ M, naciśnij ^ V ^ M, gdzie ^ to CTRL na większości klawiatur)

Tobias Baaz
źródło
66
także:% s / \ r $ //, aby uniknąć kłopotów z ^ V ^ M
glenn jackman,
8
Albo, oszczędzając charakter::%s/\r$
sehe
2
@sehe technicznie oszczędza 2 znaki :)
Chris
@glennjackman, twoja wskazówka była dużo łatwiejsza, ponieważ walczyłem o uzyskanie ^ V + ^ M, gdyby w ogóle się nie działo. Wszystko, co otrzymywałem, to zawartość w schowku (ponieważ ^ V było skuteczne za każdym razem, pomimo moich wielokrotnych prób z różnymi strategiami, aby uzyskać oba).
itsraghz
87

Prostym sposobem na usunięcie końcówek linii DOS jest użycie ffopcji:

:set ff=unix
:wq

Teraz twój plik jest z powrotem na dobry, stary Unix sposób.

Jeśli chcesz dodać zakończenia linii DOS (aby drukarka była zadowolona lub przesyłała pliki ze znajomymi z systemu Windows, którzy nie mają dobrych narzędzi), możesz łatwo pójść w przeciwnym kierunku:

:set ff=dos
:wq
sarnold
źródło
8
vim nie znalazł żadnych ^ m, \ r ani żadnego innego zakończenia linii, ale to zadziałało. Dzięki :)
SgtPooki
2
Vim nie znalazł żadnych ^ M ani \ r, ale to zadziałało! Dzięki @sarnold
7ochem
wydawałoby się, że git jest zbyt głupi, aby wykryć to jako pojedynczą zmianę znaku. Uruchomiłem to w Vimie i git diffpokazuje, że każda linia została usunięta i każda dodana: /
Tommy
Tommy, to jest ograniczenie diff, nie włączone git.
Spidey
34

Możesz to zrobić:

:set fileformats=dos

Ukryje ^Mpliki bez dotykania pliku.

jqno
źródło
17

Jest program o nazwie dos2unix, który powinien je usunąć. Windows używa różnych znaków końca linii, dlatego tak się dzieje.

Adam Lassek
źródło
6

To zadziałało dla mnie w pliku, który miał wszystko w jednej linii:

Najpierw znajdź wszystkie dopasowania

:%s/^M//

(Aby uzyskać ^M, naciśnij ^ V ^ M, gdzie ^ jest Ctrlna większości klawiatur)

Następnie zamień na nowe linie

:%s//\r/g

Połączone polecenie to:

:%s/^M/\r/g
TheRealKingK
źródło
Dzięki, zastanawiałem się, jak właściwie wpisać Ctrl-M w wyszukiwaniu-zamianie!
Roboprog
2

Zwykle przeglądam pliki z problemami fromdosprzed ich ponownym otwarciem. fromdosjest częścią pakietu tofrodos .

Ted Percival
źródło
1

Przyczyną problemu mógł być transfer FTP. Kiedy przesyłasz te pliki z jednej skrzynki do drugiej, upewnij się, że używasz transferów ASCII. Użyj polecenia „ASC”.

Spencer Ruport
źródło
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
źródło
0

mcedit: shift + f2, ustaw format unix (LF), ok

Wasilij Czapajew
źródło