Co to są te ^ M, które ciągle pojawiają się w moich plikach w emacsie?

157

Więc myślę, że może to mieć coś wspólnego z textmate, ale pracujemy w małym zespole i mamy pewne problemy z konfliktami pełnych plików prawie identycznych plików w git, ponieważ każda linia jednej gałęzi ma dołączone ^ M.

Co ma zrobić ta tajemnicza ^Mpostać i skąd może pochodzić?

Nasi programiści używają emacsa na Windows / Mac, TextMate na Macu, cody na Macu i czasami z edytora tekstu wp-admin.

Czy ktoś miał kiedyś ten problem wynikający z jednego z nich?

Neil Sarkar
źródło
3
Co warto: wyszukaj „ctrl” zamiast ^
Broam
3
Większy problem polega na tym, co zamierzasz z tym zrobić? Są szanse, że Emacs ich nie przedstawia. Twój zespół powinien zdecydować, czy pliki powinny być w formacie DOS (mają ^ M), czy w formacie Unix (bez ^ M), i wymusić to.
Trey Jackson,

Odpowiedzi:

111

W git-config ustaw core.autocrlftak, trueaby git automatycznie konwertował zakończenia linii poprawnie dla twojej platformy, np. Uruchom to polecenie dla ustawienia globalnego:

git config --global core.autocrlf true
Josh Lee
źródło
6
Myślę, że to najlepsza odpowiedź, ponieważ odpowiada na pytanie w kontekście PO, czyli git.
neontapir
Miałem już „[core] \ n autocrlf = true” w moim pliku „~ / .gitconfig”, ale nadal pozwala mi to „git clone code.google.com/p/pytomtom ” ze znakami „^ m” ??? ??
Big Rich
11
Ta odpowiedź ma zastosowanie TYLKO, jeśli Twoja platforma to Windows! Jeśli pracujesz na Macu / Linuksie, „prawda” powinna stać się „wejściem”! Zobacz help.github.com/articles/dealing-with-line-endings i tutaj: stackoverflow.com/questions/9225599/…
K.-Michael Aye
OSTRZEŻENIE: ta odpowiedź powoduje uszkodzenie wielu innych plików, gdy git nieprawidłowo „zgaduje”, że zakończenia linii są nieważne i należy je zmienić. Jest to zabójcze dla projektów oprogramowania, w których te znaki istnieją w pliku danych (tak, zostałem spalony przez to, bolesne do zerwania). To straszne rozwiązanie IMHO.
Adam
@Adam Co dokładnie przerwa zmianę końcówek linii? Gdzie miałeś problem podczas pracy z danymi? Nie powinno to na nic wpływać, to po prostu inny sposób zaznaczania końca wiersza. Po prostu się zastanawiam.
MBI
97

Ktoś nieprawidłowo konwertuje znaki końca linii .

Zakładam, że to ludzie Windowsa, ponieważ kochają swoje CRLF. Unix kocha LF, a Mac kochał CR, dopóki nie został pokazany na sposób uniksowy.

Broam
źródło
12
Dla wyjaśnienia: Mac używał CR do wersji 10 (OS X), teraz używa LF.
Mikael S
34
Wydaje mi się, że sposób Windowsa jest bardziej logiczny, ponieważ terminy CR i LF pochodzą z czasów maszyn do pisania. Musiałeś zrobić jedno i drugie: powrót karetki, aby uzyskać punkt pisania na początku wiersza i znak nowego wiersza, aby przewinąć o jedną linię w dół. Sposób Mac OS Classic (CR) na maszynie do pisania po prostu nadpisywałby tę samą linię. Uniksowy sposób (LF) na maszynie do pisania powodowałby wyświetlanie tekstu schodkowego, aż do osiągnięcia pełnej szerokości strony. :)
Otherside
114
@Inne: bardziej logiczne tylko w sensie „chcemy naśladować maszynę do pisania”. Nie mogę zacząć rozumieć, dlaczego jest to już choć trochę przydatne.
Bryan Oakley,
29
@ Poza tym, dlaczego miałbyś przedstawiać coś za pomocą dwóch znaków, skoro można to przedstawić za pomocą jednego znaku?
Matthew G
13
@Matthew G: Wszystko można przedstawić w jednej postaci, o ile wielu z nas się na to zgodzi. Czy to oznacza, że ​​powinniśmy? Możemy wpisać wszystkie nasze wiadomości bez znaków interpunkcyjnych, wielkich liter i tylko każdego zdania w nowej linii i każdy by to zrozumiał. Czy to oznacza, że ​​powinniśmy? Nie chodzi o „robienie czegoś, bo możemy”. To powiedziawszy, wolę też model LF.
jaffog,
33

^Mjest 0x0d, czyli znak powrotu karetki. Jeśli twój wyświetlacz wygląda

linia 1 ^ M
linia 2 ^ M

plik musi pochodzić z systemu Windows, ponieważ standardowa sekwencja nowej linii w systemie Windows to CR LF( 0x0d 0x0a), podczas gdy standardowa sekwencja nowej linii składa się wyłącznie z LFUnices.

Jeśli plik pochodzi z systemu Mac OS 9 lub starszego, zobaczysz go jako

linia 1 ^ Mlinia 2 ^ M

ponieważ po powrocie karetki nie byłoby nowych wierszy.

Sinan Ünür
źródło
28

Aby ^ M zniknęło z gita, wpisz:

git config --global core.whitespace cr-at-eol

Kredyty: https://lostechies.com/keithdahlby/2011/04/06/windows-git-tip-hide-carriage-return-in-diff/

bonif
źródło
1
niczego nie zmienia.
Vivex,
3
to tylko sprawia, że ​​^ M znika z ekranu, gdy używasz git diff, ale nadal tam jest
FernandoZ,
1
Rzeczywiście, wyświetla ^ M tylko jako białą spację, ale git diffnadal bierze pod uwagę ^ M podczas porównywania plików. Usuń to ustawienie za pomocą git config --global --unset core.whitespace(z tego wątku ).
miguelmorin
1
Możesz również pominąć, --globalaby po prostu skonfigurować bieżące repozytorium.
Derek Veit
8

Mają związek z różnicą między zakończeniami linii w stylu DOS a stylem uniksowym. Przeczytaj artykuł w Wikipedii . Możesz znaleźć narzędzie dos2unix do pomocy lub po prostu napisać mały skrypt, aby sam je naprawić.

Edycja : znalazłem następujący przykładowy kod Pythona tutaj :

string.replace( str, '\r', '' )
Parappa
źródło
3
W Emacsie byłoby to <code> M-: (ciąg-zastąpienia "\ r" "") </code>.
huaiyuan
7

Używam Android Studio (JetBrains IntelliJ IDEA ) w systemie Mac OS i moim problemem było to, że ^ M zaczęło pojawiać się w niektórych plikach w moim żądaniu ściągnięcia na GitHub . U mnie zadziałała zmiana separatora linii w pliku.

Otwórz żądany plik w edytorze przejdź do Plik przejdź do Separatory wierszy, a następnie wybierz najlepszą dla siebie opcję (dla mnie był to LF - Unix i OS X (\ n) )

Według następnego artykułu problem ten jest wynikiem pomieszania końcówek linii między systemami operacyjnymi: http://jonathonstaff.com/blog/issues-with-line-endings/

Więcej informacji znajdziesz tutaj: https://www.jetbrains.com/help/idea/configuring-line-separators.html#d84378e48

wprowadź opis obrazu tutaj

Ciasteczkowy potwór
źródło
6

zamiast zamiany zapytania możesz również użyć Mx delete-trailing-whitespace

kaineer
źródło
to nie zadziałało dla mnie ... zaznaczyłem cały tekst i uruchomiłem polecenie.
ᐅ devrimbaris
to działało dla mnie. dzięki. @devrimbaris, nie musisz niczego wybierać, po prostu uruchamiasz polecenie. „M” to klucz meta lub klawisz Escape. Więc Mx jest ucieczką, a następnie x. Następnie wpisujesz delete-trailing-whitespace i naciśnij Return.
astromax
5

~/.emacsPotnij następujące w swoim (lub równorzędnym)

(defun dos2unix ()
  "Replace DOS eolns CR LF with Unix eolns CR"
  (interactive)
    (goto-char (point-min))
      (while (search-forward "\r" nil t) (replace-match "")))

a wtedy będziesz mógł po prostu użyć M-x dos2unix.

Jakub Narębski
źródło
4

^Mna końcu wiersza w Emacsie wskazuje powrót karetki (\ r), po którym następuje wysunięcie wiersza (\ n). Często zobaczysz to, jeśli jedna osoba edytuje pliki w systemie Windows (gdzie koniec linii jest kombinacją znaku powrotu karetki i znaku nowej linii), a Ty edytujesz w systemie Unix lub Linux (gdzie koniec linii to tylko znak nowej linii).

Połączenie postaci zwykle nie jest szkodliwe. Jeśli używasz kontroli źródła, możesz skonfigurować format zameldowania pliku tekstowego, aby wiersze były magicznie dostosowane. Alternatywnie możesz użyć wyzwalaczy zameldowania i wypisania, które automatycznie „naprawią” pliki. Lub możesz po prostu użyć narzędzia takiego jak dos2unix, aby ręcznie dostosować rzeczy.

atk
źródło
2

Jak wszyscy wspominali. To inny styl zakończenia linii. MacOSX używa końcówek linii Unix - np. LF (znak nowego wiersza).

Windows używa zarówno CR (powrót karetki), jak i LF (znak nowego wiersza) jako zakończenia wiersza. Ponieważ używasz zarówno systemu Windows, jak i komputera Mac, stąd problem.

Jeśli utworzysz plik w systemie Windows, a następnie przeniesiesz go na komputer Mac, możesz zobaczyć te znaki ^ M na końcu linii.

Jeśli chcesz je usunąć, możesz to zrobić bardzo łatwo w emacsie. Po prostu zaznacz i skopiuj znak ^ M i wykonaj zapytanie-zamień ^ M na i gotowe.

EDYCJA: Inne linki, które mogą być pomocne. http://xahlee.org/emacs/emacs_adv_tips.html

To pomaga skonfigurować emacsa do używania określonego typu zakończenia linii. http://www.emacswiki.org/emacs/EndOfLineTips

Matt
źródło
2

Natknąłem się na ten problem jakiś czas temu. ^ M reprezentuje powrót karetki, a wyszukiwanie na Ctrl-Q Ctrl-M(tworzy to dosłowne ^ M) pozwoli ci uzyskać uchwyt na ten znak w Emacsie. Zrobiłem coś w ten sposób:

M-x replace-string [ENTER] C-q C-m [ENTER] \n [ENTER]
nedblorf
źródło
2

Jeśli nie masz zainstalowanego narzędzia dos2unix w swoim systemie, możesz utworzyć własne, aby pozbyć się znaków końcowych systemu Windows:

vi ~/dos2unix.bash:

z następującą treścią

#!/bin/bash
tr -d '\r' < $1 > repl.tmp
mv -f repl.tmp $1

W swoim ~ / .bashrc dodaj linię:

alias 'dos2unix=~/dos2unix.bash'

Stosowanie

dos2unix file_from_PC.txt

usunie ^ M znaków na końcach linii w plik_from_PC.txt. Możesz sprawdzić, czy je masz, czy nie, używając kota:

cat -v file_from_PC.txt
grapesh
źródło
1

Zobacz też:

Ukrywanie ^ M w emacsie

Zachowaj ostrożność, jeśli zdecydujesz się usunąć ^ M postaci i prześlij ponownie do swojego zespołu. Mogą później zobaczyć plik bez powrotu karetki.

Demosthenex
źródło
0

Rozwiązaniem dla mnie było użycie następującej funkcji elisp, którą można znaleźć w tym artykule na Wiki poświęconym Emacsowi .

 (defun dos2unix ()
      "Not exactly but it's easier to remember"
      (interactive)
      (set-buffer-file-coding-system 'unix 't) )

Wykonaj funkcję M-x dos2unixw buforze i zapisz plik, wszystko ^Mzniknie.

Carlo Rodríguez
źródło