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


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)


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

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.


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.


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

Dzięki, zastanawiałem się, jak właściwie wpisać Ctrl-M w wyszukiwaniu-zamianie!
Roboprog


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


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.