^ M là gì mà cứ hiển thị trong tập tin của tôi trong emacs?


157

Vì vậy, tôi nghĩ rằng nó có thể liên quan đến bạn cùng văn bản, nhưng chúng tôi làm việc trong một nhóm nhỏ và đang gặp một số vấn đề với xung đột tệp đầy đủ của các tệp gần giống nhau trong git vì mỗi dòng của một nhánh có ^ M được thêm vào.

^MNhân vật bí ẩn này phải làm gì, và nó có thể đến từ đâu?

Các nhà phát triển của chúng tôi sử dụng emacs trên Windows / Mac, TextMate trên Mac, coda trên Mac và đôi khi là trình soạn thảo văn bản wp-admin.

Bất cứ ai cũng có vấn đề này xuất phát từ một trong những người đó?


3
Để biết giá trị của nó: tìm kiếm "ctrl" thay vì ^
Broam

3
Vấn đề lớn hơn là, bạn sẽ làm gì với nó? Rất có thể, Emacs không giới thiệu chúng. Nhóm của bạn nên quyết định xem các tệp nên có định dạng DOS (có ^ M) hay định dạng Unix (không ^ M) và thực thi điều đó.
Trey Jackson

Câu trả lời:


111

Trong git-config , được đặt core.autocrlfđể truelàm cho git tự động chuyển đổi kết thúc dòng chính xác cho nền tảng của bạn, ví dụ: chạy lệnh này cho cài đặt chung:

git config --global core.autocrlf true

6
Tôi nghĩ rằng đây là câu trả lời tốt nhất vì nó trả lời câu hỏi trong ngữ cảnh của OP, cụ thể là git.
neontapir

Tôi đã có "[core] \ n autocrlf = true" trong tệp '~ / .gitconfig' của mình, nhưng nó vẫn cho tôi 'git clone code.google.com/p/pytomtom ' với '^ m' chars ??? ??
Big Rich

11
Câu trả lời này CHỈ áp dụng nếu nền tảng của bạn là Windows! Nếu bạn làm việc trên Mac / Linux, "true" sẽ trở thành "đầu vào"! Xem help.github.com/articles/deals-with-line-endings và tại đây: stackoverflow.com/questions/9225599/
K.-Michael Aye

CẢNH BÁO: câu trả lời này sau đó làm hỏng rất nhiều tệp khác khi git "đoán" không chính xác rằng các kết thúc dòng không quan trọng và cần phải thay đổi. Điều này gây chết người cho các dự án phần mềm nơi các ký tự này tồn tại trong một tệp dữ liệu (vâng, tôi đã bị đốt cháy bởi điều này, đau đớn đến không thể phá vỡ). Đó là một giải pháp khủng khiếp IMHO.
Adam

@Adam Điều gì chính xác phá vỡ sự thay đổi của kết thúc dòng? Bạn gặp vấn đề ở đâu khi làm việc với dữ liệu? Nó không ảnh hưởng đến bất cứ điều gì, nó chỉ là cách khác nhau để đánh dấu kết thúc hàng. Tôi chỉ thắc mắc.
MBI

97

Ai đó không chuyển đổi chính xác các ký tự kết thúc dòng của họ .

Tôi cho rằng đó là dân gian Windows vì họ yêu thích CRLF của họ. Unix yêu thích LF và Mac yêu CR cho đến khi nó được thể hiện theo cách của Unix.


12
Để làm rõ: Mac đã sử dụng CR cho đến phiên bản 10 (OS X), bây giờ nó sử dụng LF.
Mikael S

34
Tôi cảm thấy rằng cách Windows hợp lý hơn, vì các thuật ngữ CR và LF xuất phát từ thời của máy chữ. Bạn đã phải thực hiện cả hai: Quay trở lại vận chuyển để đưa điểm đánh máy đến đầu dòng và Nguồn cấp dữ liệu để cuộn một dòng xuống. Cách Mac OS Classic (CR) trên máy đánh chữ sẽ chỉ ghi đè lên cùng một dòng. Cách Unix (LF) trên một máy đánh chữ sẽ xuất ra văn bản so le cho đến khi bạn đạt được chiều rộng đầy đủ của trang. :)
Otherside

114
@Otherside: hợp lý hơn chỉ theo nghĩa "chúng tôi muốn mô phỏng một máy đánh chữ". Tôi không thể bắt đầu hiểu tại sao điều đó thậm chí còn hữu ích từ xa nữa.
Bryan Oakley

29
@Otherside tại sao bạn sẽ đại diện cho một cái gì đó với hai nhân vật khi nó có thể được đại diện với một nhân vật?
Matthew G

13
@Matthew G: Mọi thứ có thể được thể hiện trong một nhân vật, miễn là rất nhiều người trong chúng ta đồng ý với nó. Điều đó có nghĩa là chúng ta nên? Chúng tôi có thể nhập tất cả các tin nhắn của mình mà không cần chấm câu, viết hoa và chỉ mỗi câu trên một dòng mới và mọi người sẽ hiểu nó. Điều đó có nghĩa là chúng ta nên? Đó không phải là "làm một cái gì đó bởi vì chúng ta có thể". Điều đó nói rằng, tôi thích các LF là tốt.
jaffog

33

^M0x0d, tức là nhân vật trở về xe ngựa. Nếu màn hình của bạn trông như

dòng 1 ^ M
dòng 2 ^ M

thì tệp phải đến từ Windows vì trình tự dòng mới tiêu chuẩn trên Windows là CR LF( 0x0d 0x0a) trong khi trình tự dòng mới tiêu chuẩn chỉ bao gồm LFtrên Unices.

Nếu tệp đến từ hệ điều hành Mac OS 9 trở về trước, bạn sẽ thấy nó là

dòng 1 ^ Mline 2 ^ M

bởi vì sẽ không có nguồn cấp dữ liệu sau khi vận chuyển trở lại.


28

Để làm cho ^ M biến mất trong git, gõ:

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

Tín dụng: https://lostechies.com/keithdahlby/2011/04/06/windows-git-tip- leather-carcar-remurn-in-diff /


1
không thay đổi bất cứ điều gì.
Vivex

3
điều đó chỉ làm cho ^ M biến mất khỏi màn hình khi sử dụng git diff nhưng nó vẫn ở đó
FernandoZ

1
Thật vậy, nó chỉ hiển thị ^ M dưới dạng khoảng trắng, nhưng git diffvẫn tính đến ^ M khi so sánh các tệp. Hủy bỏ cài đặt này với git config --global --unset core.whitespace(từ chủ đề này ).
Miguelmorin

1
Bạn cũng có thể bỏ qua --globalđể chỉ cấu hình repo hiện tại.
Derek Veit

8

Chúng phải làm với sự khác biệt giữa các kết thúc dòng kiểu DOS và kiểu Unix. Kiểm tra bài viết Wikipedia . Bạn có thể tìm một công cụ dos2unix để trợ giúp hoặc chỉ cần viết một tập lệnh nhỏ để tự sửa chúng.

Chỉnh sửa : Tôi tìm thấy mã mẫu Python sau đây :

string.replace( str, '\r', '' )

3
Trong Emacs, đó sẽ là <code> M-: (chuỗi thay thế "\ r" "") </ code>.
huaiyuan

7

Tôi đang sử dụng Android Studio (JetBrains IntelliJ IDEA ) trên Mac OS và vấn đề của tôi là ^ M bắt đầu hiển thị trong một số tệp trong yêu cầu kéo của tôi trên GitHub . Điều làm việc cho tôi là thay đổi dấu phân cách dòng cho một tệp.

Mở tệp mong muốn trong trình chỉnh sửa sửa, chuyển đến Tệp đi đến Trình phân tách dòng sau đó chọn tùy chọn tốt nhất cho bạn (đối với tôi đó là LF - Unix và OS X (\ n) )

Theo bài viết tiếp theo, vấn đề này là kết quả của sự kết thúc dòng nhầm lẫn giữa các hệ điều hành: http://jonathonstaff.com/blog/issues-with-line-endings/

Và thêm thông tin bạn có thể tìm thấy ở đây: https://www.jetbrains.com/help/idea/configuring-line-separators.html#d84378e48

nhập mô tả hình ảnh ở đây


6

thay vì truy vấn thay thế, bạn cũng có thể sử dụng Mx xóa-dấu vết-khoảng trắng


điều này không làm việc cho tôi ... Tôi đã chọn tất cả văn bản và chạy lệnh.
devrimbaris

Điều này làm việc cho tôi. cảm ơn. @devrimbaris, bạn không cần chọn gì cả, bạn chỉ cần chạy lệnh. 'M' là khóa meta hoặc phím thoát. Vậy Mx là thoát rồi x. Sau đó, bạn gõ vào xóa-dấu vết-khoảng trắng và nhấn return.
Astromax

5

Pot sau đây trong ~/.emacs(hoặc eqiuvalent) của bạn

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

và sau đó bạn sẽ có thể chỉ cần sử dụng M-x dos2unix.


4

^Mở cuối dòng trong Emacs đang biểu thị lợi nhuận vận chuyển (\ r) theo sau là một nguồn cấp dữ liệu (\ n). Bạn sẽ thường thấy điều này nếu một người chỉnh sửa các tệp trên Windows (trong đó dòng cuối là sự kết hợp giữa ký tự dòng và ký tự dòng mới) và bạn chỉnh sửa trong Unix hoặc Linux (trong đó dòng cuối chỉ là ký tự dòng mới).

Sự kết hợp của các nhân vật thường không có hại. Nếu bạn đang sử dụng kiểm soát nguồn, bạn có thể định cấu hình định dạng kiểm tra tệp văn bản để các dòng được điều chỉnh một cách kỳ diệu cho bạn. Ngoài ra, bạn có thể sử dụng trình kích hoạt đăng ký và kiểm tra sẽ tự động "sửa" các tệp cho bạn. Hoặc, bạn có thể chỉ cần sử dụng một công cụ như dos2unix để điều chỉnh thủ công mọi thứ.


2

Như mọi người đã đề cập. Đó là phong cách kết thúc dòng khác nhau. MacOSX sử dụng kết thúc dòng Unix - tức là LF (nguồn cấp dữ liệu).

Windows sử dụng cả CR (trả lại vận chuyển) & LF (nguồn cấp dữ liệu) làm dòng kết thúc. Vì bạn đang sử dụng cả windows và mac, nơi vấn đề bắt nguồn từ đó.

Nếu bạn tạo một tệp trong windows và sau đó đưa nó lên mac, bạn có thể thấy các ký tự ^ M này ở cuối dòng.

Nếu bạn muốn loại bỏ chúng, bạn có thể làm điều này rất dễ dàng trong emacs. Chỉ cần tô sáng và sao chép ký tự ^ M và thực hiện truy vấn thay thế ^ M bằng và bạn đã hoàn thành.

EDIT: Một số liên kết khác có thể giúp đỡ. http://xahlee.org/emacs/emacs_adv_tips.html

Điều này giúp bạn định cấu hình emacs để sử dụng một kiểu kết thúc dòng cụ thể. http://www.emacswiki.org/emacs/EndOfLineTips


2

Tôi gặp vấn đề này một thời gian trở lại. ^ M đại diện cho Vận chuyển trở lại và tìm kiếm trên Ctrl-Q Ctrl-M(Điều này tạo ra một chữ ^ M) sẽ cho phép bạn xử lý nhân vật này trong Emacs. Tôi đã làm một cái gì đó dọc theo những dòng này:

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

2

Nếu bạn chưa cài đặt tiện ích dos2unix trên hệ thống của mình, bạn có thể tự tạo tiện ích để loại bỏ các ký tự nội tuyến của Windows:

vi ~/dos2unix.bash:

với nội dung sau

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

Trong ~ / .bashrc của bạn, thêm dòng:

alias 'dos2unix=~/dos2unix.bash'

Áp dụng

dos2unix file_from_PC.txt

sẽ xóa ^ M ký tự tại các dòng kết thúc bằng file_from_PC.txt. Bạn có thể kiểm tra xem bạn có những thứ đó hay không bằng cách sử dụng mèo:

cat -v file_from_PC.txt

1

Xem thêm:

Ẩn ^ M trong emacs

Hãy cẩn thận nếu bạn chọn xóa các ký tự ^ M và gửi lại cho nhóm của mình. Họ có thể thấy một tập tin mà không có vận chuyển trở lại sau đó.


0

Giải pháp cho tôi là sử dụng chức năng elisp sau đây được tìm thấy trong Bài viết Wiki Emacs này .

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

Thực hiện chức năng M-x dos2unixtrên bộ đệm và lưu tệp, tất cả ^Msẽ biến mất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.