Apa ini ^ M yang terus muncul di file saya di emacs?

157

Jadi saya pikir itu mungkin ada hubungannya dengan textmate, tetapi kami bekerja dalam tim kecil dan mengalami beberapa masalah dengan konflik file lengkap dari file yang hampir identik di git karena setiap baris dari satu cabang memiliki ^ M yang ditambahkan padanya.

Apa yang ^Mharus dilakukan oleh karakter misterius ini , dan dari mana asalnya?

Pengembang kami menggunakan emacs pada Windows / Mac, TextMate pada Mac, coda pada Mac, dan kadang-kadang editor teks wp-admin.

Adakah yang pernah mengalami masalah ini berasal dari salah satunya?

Neil Sarkar
sumber
3
Untuk apa nilainya: cari "ctrl" bukan ^
Broam
3
Masalah yang lebih besar adalah, apa yang akan Anda lakukan? Kemungkinannya, Emacs tidak memperkenalkan mereka. Tim Anda harus memutuskan apakah file-file tersebut harus dalam format DOS (memiliki ^ M) atau format Unix (tidak ^ M), dan menegakkannya.
Trey Jackson

Jawaban:

111

Di git-config , setel core.autocrlfuntuk truemembuat git secara otomatis mengonversi ujung jalur dengan benar untuk platform Anda, mis. Jalankan perintah ini untuk pengaturan global:

git config --global core.autocrlf true
Josh Lee
sumber
6
Saya pikir ini adalah jawaban terbaik karena menjawab pertanyaan dalam konteks OP, yaitu git.
neontapir
Saya sudah memiliki "[core] \ n autocrlf = true" di file '~ / .gitconfig' saya, tetapi masih membiarkan saya 'git clone code.google.com/p/pytomtom ' dengan '^ m' chars ??? ??
Big Rich
11
Jawaban ini HANYA berlaku jika platform Anda adalah Windows! Jika Anda bekerja di Mac / Linux, "true" harus menjadi "input"! Lihat help.github.com/articles/dealing-with-line-endings dan di sini: stackoverflow.com/questions/9225599/…
K.-Michael Aye
PERINGATAN: jawaban ini kemudian merusak banyak file lain ketika git salah "menebak" bahwa akhir baris tidak penting dan perlu diubah. Ini mematikan untuk proyek perangkat lunak di mana karakter ini ada dalam file data (ya, saya telah dibakar oleh ini, menyakitkan untuk dilepaskan). Ini solusi IMHO yang mengerikan.
Adam
@ Adam Apa yang sebenarnya mematahkan perubahan akhir baris? Di mana Anda memiliki masalah, ketika bekerja dengan data? Seharusnya tidak mempengaruhi apa pun, itu hanya cara yang berbeda untuk menandai ujung baris. Saya hanya ingin tahu.
MBI
97

Seseorang tidak mengonversi karakter akhir baris dengan benar .

Saya menganggap itu adalah rakyat Windows karena mereka menyukai CRLF mereka. Unix mencintai LF dan Mac menyukai CR sampai ditunjukkan cara Unix.

Broam
sumber
12
Untuk klarifikasi: Mac menggunakan CR sampai versi 10 (OS X), sekarang menggunakan LF.
Mikael S
34
Saya merasa bahwa cara Windows lebih logis, karena istilah CR dan LF berasal dari zaman mesin tik. Anda harus melakukan keduanya: Pengembalian Carriage untuk mendapatkan titik pengetikan di awal baris dan Umpan Baris untuk menggulir satu baris ke bawah. Cara Mac OS Classic (CR) pada mesin tik hanya akan terus menimpa baris yang sama. Cara Unix (LF) pada mesin tik akan menampilkan teks terhuyung-huyung sampai Anda mencapai lebar penuh halaman. :)
Otherside
114
@Otherside: lebih logis hanya dalam arti "kami ingin meniru mesin tik". Saya tidak bisa mulai mengerti mengapa itu bahkan jauh berguna lagi.
Bryan Oakley
29
@Otherside mengapa Anda mewakili sesuatu dengan dua karakter ketika itu dapat diwakili dengan satu karakter?
Matius G
13
@Matthew G: Semuanya bisa direpresentasikan dalam satu karakter, asalkan banyak dari kita menyetujuinya. Apakah itu berarti kita harus melakukannya? Kami dapat mengetik semua pesan kami tanpa tanda baca, huruf besar, dan hanya setiap kalimat pada baris baru, dan semua orang akan memahaminya. Apakah itu berarti kita harus melakukannya? Ini bukan tentang "melakukan sesuatu karena kita bisa". Yang mengatakan, saya lebih suka LF juga.
jaffog
33

^Madalah 0x0d, yaitu karakter carriage return. Jika tampilan Anda terlihat seperti

baris 1 ^ M
baris 2 ^ M

maka file tersebut harus berasal dari Windows karena urutan baris baru standar pada Windows adalah CR LF( 0x0d 0x0a) sedangkan urutan baris baru standar hanya terdiri dari LFpada Unices.

Jika file tersebut berasal dari sistem Mac OS 9 atau sebelumnya, Anda akan melihatnya sebagai

baris 1 ^ Mline 2 ^ M

karena tidak akan ada feed garis setelah carriage kembali.

Sinan Ünür
sumber
28

Untuk membuat ^ M menghilang di git, ketik:

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

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

bonif
sumber
1
tidak mengubah apa pun.
Vivex
3
yang hanya membuat ^ M menghilang dari tampilan saat menggunakan git diff tetapi masih ada
FernandoZ
1
Memang, ini hanya menampilkan ^ M sebagai spasi, tetapi git diffmasih mempertimbangkan ^ M saat membandingkan file. Hapus pengaturan ini dengan git config --global --unset core.whitespace(dari utas ini ).
miguelmorin
1
Anda juga dapat menghilangkan --globaluntuk hanya mengkonfigurasi repo saat ini.
Derek Veit
8

Mereka harus melakukan dengan perbedaan antara ujung garis gaya DOS dan gaya Unix. Lihatlah artikel Wikipedia . Anda mungkin dapat menemukan alat dos2unix untuk membantu, atau cukup menulis skrip kecil untuk memperbaikinya sendiri.

Sunting : Saya menemukan kode sampel Python berikut di sini :

string.replace( str, '\r', '' )
Parappa
sumber
3
Di Emacs, itu akan menjadi <code> M-: (ganti-string "\ r" "") </code>.
huaiyuan
7

Saya menggunakan Android Studio (JetBrains IntelliJ IDEA ) di Mac OS dan masalah saya adalah bahwa ^ M mulai muncul di beberapa file dalam permintaan tarik saya di GitHub . Apa yang berhasil bagi saya adalah mengubah pemisah baris untuk file.

Buka file yang diinginkan dalam editor, buka File, pergi ke Line Separators kemudian pilih opsi terbaik untuk Anda (bagi saya itu adalah LF - Unix dan OS X (\ n) )

Menurut artikel berikutnya, masalah ini adalah akibat dari ujung garis yang membingungkan antara sistem operasi: http://jonathonstaff.com/blog/issues-with-line-endings/

Dan informasi lebih lanjut dapat Anda temukan di sini: https://www.jetbrains.com/help/idea/configuring-line-separators.html#d84378e48

masukkan deskripsi gambar di sini

Monster kue
sumber
6

alih-alih ganti permintaan, Anda juga dapat menggunakan Mx delete-trailing-whitespace

kaineer
sumber
ini tidak berfungsi untuk saya ... Saya telah memilih semua teks dan menjalankan perintah.
ᐅ devrimbaris
ini bekerja untuk saya. Terima kasih. @devrimbaris, Anda tidak perlu memilih apa pun, Anda cukup menjalankan perintah. 'M' adalah kunci meta, atau kunci keluar. Jadi Mx melarikan diri maka x. Kemudian Anda ketik delete-trailing-whitespace, dan tekan return.
astromax
5

~/.emacsMasukkan yang berikut ini di (atau eqiuvalent) Anda

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

dan kemudian Anda akan dapat menggunakannya M-x dos2unix.

Jakub Narębski
sumber
4

^Mpada akhir baris di Emacs menunjukkan carriage return (\ r) diikuti oleh umpan baris (\ n). Anda akan sering melihat ini jika satu orang mengedit file di Windows (di mana ujung baris adalah kombinasi carriage return dan karakter baris baru) dan Anda mengedit di Unix atau Linux (di mana ujung baris hanya karakter baris baru).

Kombinasi karakter biasanya tidak berbahaya. Jika Anda menggunakan kontrol sumber, Anda mungkin dapat mengonfigurasi format checkin file teks sehingga garis disesuaikan secara ajaib untuk Anda. Sebagai alternatif, Anda mungkin dapat menggunakan checkin dan checkout trigger yang secara otomatis akan "memperbaiki" file untuk Anda. Atau, Anda mungkin hanya menggunakan alat seperti dos2unix untuk menyesuaikan hal-hal secara manual.

atk
sumber
2

Seperti semua orang telah sebutkan. Ini gaya garis akhir yang berbeda. MacOSX menggunakan ujung garis Unix - yaitu LF (umpan baris).

Windows menggunakan CR (carriage return) & LF (feed line) sebagai akhir baris. Karena Anda menggunakan kedua windows dan mac di situlah masalah berasal.

Jika Anda membuat file di windows dan kemudian membawanya ke mac Anda mungkin melihat karakter ^ M ini di akhir baris.

Jika Anda ingin menghapusnya, Anda dapat melakukannya dengan sangat mudah di emacs. Cukup sorot dan salin karakter ^ M dan lakukan permintaan-ganti ^ M dengan dan Anda selesai.

EDIT: Beberapa tautan lain yang mungkin bisa membantu. http://xahlee.org/emacs/emacs_adv_tips.html

Yang ini membantu Anda mengkonfigurasi emacs untuk menggunakan tipe gaya akhiran tertentu. http://www.emacswiki.org/emacs/EndOfLineTips

Mat
sumber
2

Saya mengalami masalah ini beberapa waktu lalu. ^ M mewakili Pengembalian Gerbong, dan mencari di Ctrl-Q Ctrl-M(Ini membuat ^ M harfiah) akan memungkinkan Anda mendapatkan pegangan pada karakter ini dalam Emacs. Saya melakukan sesuatu seperti ini:

M-x replace-string [ENTER] C-q C-m [ENTER] \n [ENTER]
nedblorf
sumber
2

Jika Anda tidak memiliki utilitas dos2unix yang terinstal di sistem Anda, Anda dapat membuatnya sendiri untuk menghilangkan karakter endline Windows:

vi ~/dos2unix.bash:

dengan konten berikut

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

Di ~ / .bashrc Anda, tambahkan baris:

alias 'dos2unix=~/dos2unix.bash'

Menerapkan

dos2unix file_from_PC.txt

akan menghapus ^ M karakter pada baris yang berakhir di file_from_PC.txt. Anda dapat memeriksa apakah Anda memilikinya atau tidak dengan menggunakan cat:

cat -v file_from_PC.txt
grapesh
sumber
1

Lihat juga:

Menyembunyikan ^ M di emacs

Hati-hati jika Anda memilih untuk menghapus karakter ^ M dan mengirim kembali ke tim Anda. Mereka mungkin melihat file tanpa carriage return sesudahnya.

Demosthenex
sumber
0

Solusi bagi saya adalah dengan menggunakan fungsi elisp berikut yang ditemukan dalam Artikel Wiki Emacs ini .

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

Jalankan fungsi M-x dos2unixpada buffer dan simpan file, semua ^Makan hilang.

Carlo Rodríguez
sumber