Co oznacza znak ^ M w Vimie?

500

Ciągle otrzymuję ^Mpostać w moim vimrc i to psuje moją konfigurację.

Max
źródło
35
BTW to świetny zasób.
Wyścigi lekkości na orbicie
@LightnessRacesinOrbit - Hm, teraz działa również formy. Wycofałem swój komentarz, mówiąc, że link był martwy.
ArtOfWarfare
3
Mirror dla linku @LightnessRacesinOrbit, który jest aktualnie niedostępny
alexpls
4
Wpisanie :digraphsw vimie pokazuje tabelę digraph, z którą łączy się @LightnessRacesinOrbit.
askewchan
1
Próbując zastąpić tego rodzaju postać za pomocą php, wypróbuj tę preg_replace('/[\x01]/', ' ' ,$str); Nadzieję, że to pomaga.
Rachel Geller,

Odpowiedzi:

561

Unix używa 0xA do znaku nowej linii. System Windows używa kombinacji dwóch znaków: 0xD 0xA. 0xD jest znakiem powrotu karetki. ^Mtak się składa, że ​​vim wyświetla 0xD (0x0D = 13, M jest 13. literą alfabetu angielskiego).

Możesz usunąć wszystkie ^Mznaki, wykonując następujące czynności:

:%s/^M//g

Gdzie wpisuje się , ^Mprzytrzymując Ctrli wpisując , a następnie, a następnie zwalniając . Czasami jest to skracane jako , ale pamiętaj, że musisz wpisać go tak, jak opisano w poprzednim zdaniu, zamiast wpisywać go dosłownie.vmCtrl^V^M

Wyrażenie to zastąpi wszystkie wystąpienia ^Mpustym łańcuchem (tzn. Niczym). Używam tego, aby pozbyć się ^Mplików skopiowanych z Windowsa na Unixa (Solaris, Linux, OSX).

Tomasz Stanczak
źródło
9
Na wszelki wypadek w systemie Windows Ctrl + V prawdopodobnie zostanie zmapowany do wklejenia. W takim przypadku domyślne ustawienia przypisują ponownie klawisz „specjalnego znaku ucieczki” do Ctrl + Q.
R. Martinho Fernandes
8
Prawdziwe pytanie brzmi: dlaczego Vim czasami automatycznie wykrywa zakończenia linii i wyświetla poprawnie, a czasem nie.
Scott
10
Zobaczysz ^Mznak, jeśli plik ma niedopasowane zakończenia linii. Użyj polecenia dostarczonego przez Tomasza, a następnie wpisz w :fileformat={unix|dos|mac}zależności od systemu operacyjnego, na który celujesz. Jeśli jest tylko kilka linii bez ^Mznaku, prawdopodobnie chcesz :fileformat=dos. Jeśli edytujesz pliki w edytorze innym niż vim, upewnij się, że jest skonfigurowany tak, aby pasował do końców linii (Notepad tego nie zrobi, ale zrobi to dowolny renomowany edytor, taki jak Notepad ++ lub TextMate).
Mikkel Paulson
9
Uwaga dla początkujących vi, że to polecenie należy wpisać ręcznie. Samo wklejenie go do otwartego terminalu z viuruchomionym spowoduje błąd „wzorzec nie znaleziony”.
IQAndreas
51
@bluesm Właściwie musiałem użyć, :%s/\r//gaby zastąpić zwroty karetki w moim pliku.
Wzorca
139
:%s/\r//g 

pracował dla mnie dzisiaj. Ale moja sytuacja mogła być nieco inna.

dlk5730
źródło
1
opcja g nie jest wymagana, w linii jest tylko jedna nowa linia. :%s/\r//wystarczyłoby.
frogcoder,
7
Opcja g może być bardzo wymagana, ponieważ znak powrotu karetki niekoniecznie jest znakiem nowej linii. Po otwarciu w trybie uniksowym powrót karetki jest tylko kolejnym znakiem, a po otwarciu w trybie Windows powrót karetki jest wyjątkowy, a po nim następuje przejście do nowego wiersza.
Jonathan Baldwin
65

Aby przetłumaczyć nowy wiersz zamiast go usunąć:

:%s/\r/\r/g
Mori
źródło
2
Co to właściwie ma zrobić? Dla mnie wygląda na to, że zastępuje podobnego za podobnym, co, jak sądzę, nie zmieni niczego. Czy brakuje mi czegoś specjalnego w tym, jak działa składnia?
Platinum Azure,
16
@PlatinumAzure Nie wiem, dlaczego nikt nigdy nie pomyślał, aby odpowiedzieć na twoje pytanie. \rma inne zachowanie w części wyszukiwania niż w części zastępującej. Zobacz na przykład stackoverflow.com/a/3834303 .
Lub :%s/^V^M/^V^M/g zobacz tutaj
tomd
@TomD Link odnosi się do odpowiedzi, którą komentujesz.
bzeaman
Dla mnie to irytujące postacie zastąpiły dodatkową nową linią. @ dlk5730 odpowiedź działała dla mnie lepiej. tj.:%s/\r//g
marcusshep,
37

Prawdopodobnie oznacza to, że masz znaki powrotu karetki (różne systemy operacyjne używają różnych sposobów sygnalizowania końca linii).

Użyj, dos2unixaby naprawić pliki lub ustawić formaty plików w vimie:

set ffs=unix,dos
cnicutar
źródło
19

Załóżmy, że Twój plik tekstowy to - plik.txt, a następnie uruchom to polecenie -

dos2unix file.txt 

Konwertuje plik tekstowy z dos na format unix.

akritaag
źródło
Działa świetnie !
robe007
9

Mam plik tekstowy wygenerowany pierwotnie na komputerze z systemem Windows przez użytkownika komputera Mac i musiałem zaimportować go do Linux MySQL DB za pomocą load datapolecenia.

Chociaż VIM wyświetlał znak „^ M”, żadne z powyższych nie działało w przypadku mojego konkretnego problemu, dane były importowane, ale zawsze były w jakiś sposób uszkodzone. Rozwiązanie było dość łatwe (po frustracji).

Rozwiązanie: Wykonanie dos2unix DWUKROTNIE na tym samym pliku załatwiło sprawę ! Używającfile polecenia pokazuje, co dzieje się po drodze.

$ file 'file.txt'
file.txt: ASCII text, with CRLF, CR line terminators

$ dos2unix 'file.txt'
dos2unix: converting file file.txt to UNIX format ...
$ file 'file.txt'
file.txt: ASCII text, with CRLF line terminators

$ dos2unix 'file.txt'
dos2unix: converting file file.txt to UNIX format ...
$ file 'file.txt'
file.txt: ASCII text

Ostateczna wersja pliku została idealnie zaimportowana do bazy danych.

Anthony Palmer
źródło
9

W Uniksie prawdopodobnie łatwiej jest użyć polecenia „tr”.

cat file1.txt | tr "\r" "\n" > file2.txt
Irving Rabin
źródło
9

Usunąłem je wszystkie za pomocą sed:

sed -i -e 's/\r//g' <filename>

Można również zastąpić innym ciągiem lub znakiem:

sed -i -e 's/\r/string/g' <filename>

Te sedpolecenia działają w wersji GNU / Linux, sedale mogą wymagać ulepszenia w BSD (w tym macOS).

Freedom_Ben
źródło
4

Możesz to naprawić w vimie za pomocą

:1,$s/^V^M//g

gdzie ^ jest znakiem kontrolnym.

Scott C. Wilson
źródło
2
To nie wyjaśnia, co ^Mjest.
Wyścigi lekkości na orbicie
2
Tak naprawdę nie pyta, co to jest, pyta, jak to naprawić. Co to jest znak powrotu karetki z DOS.
Scott C Wilson,
3
Ja wiem, co to jest. Tytuł pytania brzmi „Co oznacza znak ^ M w Vimie”.
Wyścigi lekkości na orbicie
3

To jedyna rzecz, która zadziałała w moim przypadku:

:e ++ff=dos

:wq

Sardeep Lakhera
źródło
2

Jeśli psuje konfigurację, a znaki ^ M są wymagane w odwzorowaniach, możesz po prostu zamienić znaki ^ M na, <Enter>a nawet <C-m>(oba wpisane jako proste sekwencje znaków, odpowiednio odpowiednio 7 i 5 znaków).

Jest to jeden zalecany, przenośny sposób przechowywania specjalnych kodów w mapowaniach

sehe
źródło
2

W FreeBSD możesz wyczyścić ^Mręcznie, wpisując następujące polecenie:

:%s/ Ctrl+ V, następnie Ctrl+ M, a następnie Ctrl+ Mponownie.

Victor Ong
źródło
1

Jeśli nie określiłeś inaczej fileformatcelowo (powiedz:e ++ff=unix dla pliku Windows), prawdopodobnie plik docelowy ma mieszane EOL.

Na przykład, jeśli plik zawiera niektóre linie z <CR><NL>zakończeniami, a inne z <NL>zakończeniami, a Vim automatycznie fileformatustawi unixgo podczas czytania, ^M (<CR>)pojawi się. W takich przypadkach fileformatswchodzi w grę. Zobacz :help ffsszczegóły.

ebk
źródło
0

Odkryłem, że od tygodni zanieczyszczam pliki ze względu na fakt, że moja instancja Homebrew Mvim była ustawiona na użycie filetype = dos. Wprowadzono wymaganą zmianę w .vimrc ....

nichg
źródło
0

spróbuj :%s/\^M//Przynajmniej to zadziałało dla mnie.

xuc
źródło