^ M เหล่านี้คืออะไรที่ปรากฏขึ้นในไฟล์ของฉันเป็น emacs?


157

ดังนั้นฉันคิดว่ามันอาจจะเกี่ยวกับ textmate แต่เราทำงานกันเป็นทีมเล็ก ๆ และมีปัญหาบางอย่างเกี่ยวกับความขัดแย้งไฟล์เต็มรูปแบบของไฟล์ที่เกือบเหมือนกันในคอมไพล์เพราะแต่ละบรรทัดของสาขาหนึ่งมี ^ M ต่อท้าย

^Mตัวละครลึกลับนี้ควรทำอะไรและมันมาจากไหน?

นักพัฒนาของเราใช้ emacs ใน Windows / Mac, TextMate บน Mac, coda บน Mac และบางครั้งก็เป็นโปรแกรมแก้ไขข้อความ wp-admin

มีใครเคยมีปัญหานี้เกิดขึ้นจากหนึ่งในนั้นหรือไม่


3
สำหรับสิ่งที่คุ้มค่า: ค้นหา "Ctrl" แทน ^
Broam

3
ปัญหาที่ใหญ่กว่าคือคุณจะทำอย่างไรกับเรื่องนี้? มีโอกาส Emacs ไม่แนะนำพวกเขา ทีมของคุณควรตัดสินใจว่าไฟล์ควรเป็นรูปแบบ DOS (มี ^ M) หรือรูปแบบ Unix (ไม่ใช่ ^ M) และบังคับใช้
Trey Jackson

คำตอบ:


111

ในgit-configให้ตั้งค่าcore.autocrlfเพื่อtrueให้ git แปลงการสิ้นสุดบรรทัดโดยอัตโนมัติอย่างถูกต้องสำหรับแพลตฟอร์มของคุณเช่นเรียกใช้คำสั่งนี้สำหรับการตั้งค่าส่วนกลาง:

git config --global core.autocrlf true

6
ฉันคิดว่านี่เป็นคำตอบที่ดีที่สุดเพราะตอบคำถามในบริบทของ OP คือ git
neontapir

ฉันมี "[core] \ n autocrlf = true" แล้วในไฟล์ '~ / .gitconfig' ของฉัน แต่ก็ยังให้ฉัน 'git clone code.google.com/p/pytomtom ' ด้วยตัวอักษร '^ m' ??? ??
Big Rich

11
คำตอบนี้ใช้ได้เฉพาะถ้าแพลตฟอร์มของคุณเป็น Windows! หากคุณทำงานบน Mac / Linux "จริง" ควรเป็น "อินพุต"! ดูhelp.github.com/articles/dealing-with-line-endingsและที่นี่: stackoverflow.com/questions/9225599/…
K.

คำเตือน: จากนั้นคำตอบนี้จะทำให้ไฟล์อื่น ๆ เสียหายจำนวนมากเมื่อคอมไพล์ "เดา" ไม่ถูกต้องว่าการจบบรรทัดนั้นไม่สำคัญและจำเป็นต้องเปลี่ยนแปลง นี่เป็นเรื่องร้ายแรงสำหรับโครงการซอฟต์แวร์ที่มีตัวละครเหล่านี้อยู่ในไฟล์ข้อมูล (ใช่ฉันถูกเผาไปแล้วด้วยความเจ็บปวดถึงไม่หยุดพัก) มันเป็นทางออกที่เลวร้าย IMHO
อดัม

@ อดัมอะไรกันแน่ที่ทำให้การเปลี่ยนแปลงของการจบบรรทัด คุณมีปัญหาที่ไหนเมื่อทำงานกับข้อมูล มันไม่ควรส่งผลกระทบอะไรเลยมันเป็นวิธีที่แตกต่างในการทำเครื่องหมายจุดสิ้นสุดของแถว ฉันเพียงแค่สงสัย.
MBI

97

บางคนไม่ได้มีการแปลงตัวอักษรบรรทัดที่สิ้นสุดของพวกเขาได้อย่างถูกต้อง

ฉันถือว่ามันเป็น Windows แบบพื้นบ้านเพราะพวกเขารัก CRLF ของพวกเขา Unix รัก LF และ Mac รัก CR จนกว่ามันจะแสดงวิธี Unix


12
สำหรับการชี้แจง: Mac ใช้ CR จนถึงเวอร์ชัน 10 (OS X) ตอนนี้ใช้ LF
Mikael S

34
ฉันรู้สึกว่าหนทางของ Windows นั้นมีเหตุผลมากกว่านี้เนื่องจากคำว่า CR และ LF มาจากยุคของเครื่องพิมพ์ดีด คุณต้องทำทั้งสองอย่าง: Carriage Return เพื่อให้ได้จุดพิมพ์ไปที่จุดเริ่มต้นของบรรทัดและ Line Feed เพื่อเลื่อนหนึ่งบรรทัด วิธี Mac OS Classic (CR) บนเครื่องพิมพ์ดีดจะเขียนทับบรรทัดเดียวกัน วิธี Unix (LF) บนเครื่องพิมพ์ดีดจะเอาท์พุทข้อความที่ได้ถูกย้ายจนกว่าคุณจะเต็มความกว้างของหน้า :)
Otherside

114
@Otherside: ตรรกะมากขึ้นเฉพาะใน "เราต้องการเลียนแบบความรู้สึกเครื่องพิมพ์ดีด" ฉันไม่สามารถเริ่มเข้าใจได้ว่าทำไมถึงมีประโยชน์จากระยะไกลอีกต่อไป
ไบรอัน Oakley

29
@ นอกเหนือจากเหตุใดคุณจึงต้องแสดงบางสิ่งที่มีอักขระสองตัวเมื่อสามารถแสดงด้วยอักขระหนึ่งตัวได้
Matthew G

13
@ Matthew G: ทุกสิ่งสามารถแสดงเป็นตัวละครเดียวได้ตราบใดที่พวกเราเห็นด้วยกับมัน นั่นหมายความว่าเราควร? เราสามารถพิมพ์ข้อความทั้งหมดของเราโดยไม่ต้องใช้เครื่องหมายวรรคตอนตัวพิมพ์ใหญ่และเพียงแค่ประโยคทุกประโยคในบรรทัดใหม่และทุกคนจะเข้าใจมัน นั่นหมายความว่าเราควร? มันไม่เกี่ยวกับ "ทำอะไรเพราะเราทำได้" ที่กล่าวว่าฉันชอบ LF เช่นกัน
jaffog

33

^Mคือ0x0dคืออักขระที่คืนค่าขนส่ง หากจอแสดงผลของคุณดูเหมือน

บรรทัด 1 ^ M
บรรทัด 2 ^ M

ดังนั้นไฟล์จะต้องมาจาก Windows เนื่องจากลำดับบรรทัดขึ้นบรรทัดใหม่มาตรฐานบน Windows คือCR LF( 0x0d 0x0a) ในขณะที่ลำดับบรรทัดขึ้นบรรทัดใหม่มาตรฐานประกอบด้วยเฉพาะLFบน Unices

หากไฟล์นั้นมาจาก Mac OS 9 หรือระบบก่อนหน้าคุณจะเห็นว่าเป็น

บรรทัดที่ 1 ^ Mline 2 ^ M

เพราะจะไม่มีการป้อนบรรทัดหลังจากการขึ้นบรรทัดใหม่


28

ในการทำให้ ^ M หายไปในคอมไพล์ให้พิมพ์:

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

เครดิต: https://lostechies.com/keithdahlby/2011/04/06/windows-git-tip-hide-carriage-return-in-diff/


1
ไม่เปลี่ยนแปลงอะไรเลย
Vivex

3
ว่ามีเพียงทำให้ dissappear ^ M จากจอแสดงผลเมื่อใช้คอมไพล์ diff แต่ก็ยังคงมี
FernandoZ

1
อันที่จริงมันแสดงเฉพาะ ^ M เป็นช่องว่าง แต่git diffยังคำนึงถึง ^ M เมื่อเปรียบเทียบไฟล์ ลบการตั้งค่านี้ด้วยgit config --global --unset core.whitespace(จากกระทู้นี้ )
miguelmorin

1
นอกจากนี้คุณยังสามารถละเว้น--globalเพื่อเพิ่งกำหนดค่า repo ปัจจุบัน
Derek Veit

8

พวกเขาต้องทำอย่างไรกับความแตกต่างระหว่างการจบบรรทัดสไตล์ DOS และสไตล์ยูนิกซ์ ตรวจสอบบทความวิกิพีเดีย คุณอาจพบเครื่องมือ dos2unix เพื่อช่วยหรือเขียนสคริปต์ขนาดเล็กเพื่อแก้ไขด้วยตนเอง

แก้ไข : ฉันพบรหัสตัวอย่าง Python ต่อไปนี้ที่นี่ :

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

3
ใน Emacs นั้นจะเป็น <code> M-: (replace-string "\ r" "") </code>
huaiyuan

7

ฉันใช้Android สตูดิโอ (JetBrains IntelliJ IDEA ) บนระบบปฏิบัติการ Mac OSและปัญหาของฉันคือการที่ ^ M เริ่มที่จะแสดงขึ้นในบางไฟล์ในคำขอดึงฉันบนGitHub สิ่งที่ใช้ได้ผลสำหรับฉันคือเปลี่ยนตัวแยกบรรทัดสำหรับไฟล์

เปิดไฟล์ที่ต้องการในตัวแก้ไขไปที่ ไฟล์ไปที่ตัว แยกบรรทัดจากนั้น เลือกตัวเลือกที่ดีที่สุดสำหรับคุณ (สำหรับฉันมันคือLF - Unix และ OS X (\ n) )

ตามบทความถัดไปปัญหานี้เป็นผลมาจากการสิ้นสุดของบรรทัดที่สับสนระหว่างระบบปฏิบัติการ: http://jonathonstaff.com/blog/issues-with-line-endings/

และข้อมูลเพิ่มเติมคุณสามารถดูได้ที่นี่: https://www.jetbrains.com/help/idea/configuring-line-separators.html#d84378e48

ป้อนคำอธิบายรูปภาพที่นี่


6

แทนการค้นหาแบบแทนที่คุณอาจใช้ Mx delete-trailing-whitespace


สิ่งนี้ไม่ได้ผลสำหรับฉัน ... ฉันเลือกข้อความทั้งหมดแล้วจึงรันคำสั่ง
ᐅ devrimbaris

สิ่งนี้ใช้ได้สำหรับฉัน ขอบคุณ @devrimbaris คุณไม่จำเป็นต้องเลือกอะไรเลยคุณเพียงแค่เรียกใช้คำสั่ง 'M' คือคีย์เมตาหรือคีย์ Escape ดังนั้น Mx จึงหนีแล้ว x จากนั้นคุณพิมพ์ delete-trailing-whitespace และกด return return
astromax

5

ใส่หม้อต่อไปนี้ในของคุณ~/.emacs(หรือ eqiuvalent)

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

M-x dos2unixแล้วคุณจะสามารถที่จะเพียงแค่การใช้งาน


4

^Mที่ส่วนท้ายของบรรทัดใน Emacs กำลังระบุ carriage return (\ r) ตามด้วย line feed (\ n) คุณมักจะเห็นสิ่งนี้หากบุคคลหนึ่งแก้ไขไฟล์บน Windows (โดยที่ท้ายบรรทัดคือการรวมกันของอักขระขึ้นบรรทัดใหม่และอักขระขึ้นบรรทัดใหม่) และคุณแก้ไขใน Unix หรือ Linux (โดยที่จุดสิ้นสุดบรรทัดเป็นอักขระขึ้นบรรทัดใหม่เท่านั้น)

การรวมกันของตัวละครมักจะไม่เป็นอันตราย หากคุณใช้การควบคุมแหล่งข้อมูลคุณอาจสามารถกำหนดค่ารูปแบบไฟล์ข้อความเช็คอินเพื่อให้บรรทัดมีการปรับอย่างน่าอัศจรรย์สำหรับคุณ หรือคุณอาจสามารถใช้ทริกเกอร์ checkin และ checkout ซึ่งจะ "แก้ไข" ไฟล์ให้คุณโดยอัตโนมัติ หรือคุณอาจใช้เครื่องมือเช่นdos2unixเพื่อปรับสิ่งต่าง ๆ ด้วยตนเอง


2

ตามที่ทุกคนได้กล่าวถึง มันเป็นสไตล์การจบบรรทัดที่แตกต่างกัน MacOSX ใช้การสิ้นสุดบรรทัด Unix - เช่น LF (ตัวป้อนบรรทัด)

Windows ใช้ทั้ง CR (carriage return) & LF (การป้อนบรรทัด) เป็นจุดสิ้นสุดของบรรทัด เนื่องจากคุณใช้ทั้ง windows และ mac ซึ่งเป็นปัญหาที่เกิดขึ้น

หากคุณสร้างไฟล์ใน windows จากนั้นนำมาไว้ใน mac คุณอาจเห็นอักขระ ^ M เหล่านี้ที่ท้ายบรรทัด

หากคุณต้องการลบออกคุณสามารถทำได้อย่างง่ายดายใน emacs เพียงแค่ไฮไลต์และคัดลอกอักขระ ^ M และทำแบบสอบถามแทนที่ ^ M ด้วยและคุณเสร็จแล้ว

แก้ไข: ลิงค์อื่น ๆ ที่อาจเป็นประโยชน์ http://xahlee.org/emacs/emacs_adv_tips.html

สิ่งนี้ช่วยให้คุณกำหนดค่า emac เพื่อใช้รูปแบบการสิ้นสุดบรรทัดเฉพาะ http://www.emacswiki.org/emacs/EndOfLineTips


2

ฉันวิ่งเข้าไปในปัญหานี้ในขณะที่กลับ ^ M แสดงถึง Carriage Return และการค้นหาCtrl-Q Ctrl-M(ซึ่งจะสร้างตัวอักษร ^ M) จะช่วยให้คุณได้รับการจัดการกับตัวละครนี้ภายใน Emacs ฉันทำอะไรตามบรรทัดเหล่านี้:

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

2

หากคุณไม่ได้ติดตั้งยูทิลิตี dos2unix ในระบบของคุณคุณสามารถสร้างของคุณเองเพื่อกำจัดอักขระปลายทางของ Windows:

vi ~/dos2unix.bash:

ด้วยเนื้อหาดังต่อไปนี้

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

ใน ~ / .bashrc ของคุณเพิ่มบรรทัด:

alias 'dos2unix=~/dos2unix.bash'

การประยุกต์ใช้

dos2unix file_from_PC.txt

จะลบอักขระ ^ M ที่บรรทัดลงท้ายด้วย file_from_PC.txt คุณสามารถตรวจสอบว่าคุณมีหรือไม่โดยใช้ cat:

cat -v file_from_PC.txt

1

ดูสิ่งนี้ด้วย:

การซ่อน ^ M ใน emacs

ระวังถ้าคุณเลือกที่จะลบอักขระ ^ M และส่งให้ทีมของคุณอีกครั้ง พวกเขาอาจเห็นไฟล์ที่ไม่มี carriage ส่งคืนหลังจากนั้น


0

วิธีการแก้ปัญหาสำหรับฉันคือการใช้ฟังก์ชั่น Elisp ต่อไปนี้พบได้ในนี้Emacs วิกิพีเดียบทความ

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

ดำเนินการฟังก์ชั่นM-x dos2unixบนบัฟเฟอร์และบันทึกไฟล์ทั้งหมด^Mจะหายไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.