Co oznacza znak ^ M w Vimie?


500

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


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


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.


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

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

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.


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.


9

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

cat file1.txt | tr "\r" "\n" > file2.txt

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




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


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.


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.


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


0

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

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.