emacs의 내 파일에 계속 나타나는 ^ M은 무엇입니까?


162

그래서 나는 그것이 textmate와 관련이 있다고 생각하지만 우리는 소규모 팀에서 일하며 한 분기의 각 줄에 ^ M이 추가되어 있기 때문에 git에서 거의 동일한 파일의 전체 파일 충돌과 관련된 문제가 있습니다.

이 신비한 ^M캐릭터 는 무엇 을해야하며 어디에서 나올 수 있습니까?

우리 개발자들은 Windows / Mac에서 emacs, Mac에서 TextMate, Mac에서 coda를 사용하고 때로는 wp-admin 텍스트 편집기를 사용합니다.

이 문제 중 하나에서 비롯된 사람이 있습니까?


3
가치 : ^ 대신 "ctrl"검색
Broam

3
더 큰 문제는 그것에 대해 무엇을 할 것입니까? Emacs가이를 소개하지 않을 가능성이 있습니다. 팀은 파일이 DOS 형식 (^ M 있음) 또는 Unix 형식 (^ M 없음)이어야하는지 여부를 결정하고이를 적용해야합니다.
Trey Jackson

답변:


116

에서 자식-설정 , 설정 core.autocrlf하는 true자식은 자동으로, 예를 들어 플랫폼에 대해 올바르게 라인 엔딩을 변환 전역 설정에 대해이 명령을 실행하기 위해 :

git config --global core.autocrlf true

6
OP, 즉 git의 맥락에서 질문에 답하기 때문에 이것이 최선의 대답이라고 생각합니다.
neontapir

내 '~ / .gitconfig'파일에 이미 "[core] \ n autocrlf = true"가 있지만 여전히 '^ m'문자로 'git clone code.google.com/p/pytomtom '을 사용할 수 있습니다. ??? ??
Big Rich

12
이 답변 은 플랫폼이 Windows 인 경우 에만 적용됩니다! Mac / Linux에서 작업하는 경우 "true"는 "input"이되어야합니다! 참조 help.github.com/articles/dealing-with-line-endings을 여기 : stackoverflow.com/questions/9225599/...
K. - 마이클 찬성

1
경고 :이 대답은 git이 줄 끝이 중요하지 않으며 변경해야한다고 잘못 "추측"할 때 다른 많은 파일을 손상시킵니다. 이것은 이러한 문자가 데이터 파일에 존재하는 소프트웨어 프로젝트에 치명적입니다 (예, 나는 이것에 의해 태워졌고 깨지기가 고통 스럽습니다). IMHO는 끔찍한 솔루션입니다.
Adam

@Adam 정확히 줄 끝의 변경 변경은 무엇입니까? 데이터 작업시 어디에서 문제가 있었습니까? 아무 영향도주지 않고 행 끝을 표시하는 다른 방법 일뿐입니다. 그냥 궁금 해서요.
MBI

97

누군가 자신의 줄 끝 문자를 올바르게 변환하지 않습니다 .

CRLF를 좋아하는 Windows 사용자라고 생각합니다. Unix는 LF를 좋아하고 Mac은 CR을 좋아했습니다.


12
설명 : Mac은 버전 10 (OS X)까지 CR을 사용했지만 이제는 LF를 사용합니다.
Mikael S

34
CR과 LF라는 용어는 타자기 시대에서 유래했기 때문에 Windows 방식이 더 논리적이라고 생각합니다. 두 가지를 모두 수행해야했습니다. 입력 지점을 줄의 시작으로 가져 오는 Carriage Return과 한 줄 아래로 스크롤하는 Line Feed. 타자기의 Mac OS Classic 방식 (CR)은 같은 줄을 계속 덮어 씁니다. 타자기의 Unix 방식 (LF)은 페이지의 전체 너비에 도달 할 때까지 엇갈린 텍스트를 출력합니다. :)
Otherside

117
@Otherside : "타자기를 에뮬레이트하고 싶다"는 의미에서만 더 논리적입니다. 나는 그것이 더 이상 원격으로 유용한 이유를 이해할 수 없습니다.
Bryan Oakley

29
@Otherside 하나의 문자로 표현할 수 있는데 왜 두 문자로 표현하겠습니까?
마태 복음 G

13
@Matthew G : 많은 사람들이 동의하는 한 모든 것을 한 문자로 표현할 수 있습니다. 그게 우리가해야한다는 뜻입니까? 구두점, 대문자, 새 줄의 모든 문장 만 입력하면 모든 메시지를 이해할 수 있습니다. 그게 우리가해야한다는 뜻입니까? "우리가 할 수 있기 때문에 무언가를하는 것"이 ​​아닙니다. 즉, LF도 선호합니다.
jaffog 2014 년

33

^M되어 0x0d, 캐리지 리턴 문자를 즉. 디스플레이가 다음과 같은 경우

라인 1 ^ M
2 ^ M 행

Windows의 표준 줄 바꿈 시퀀스는 CR LF( 0x0d 0x0a)이고 표준 줄 바꿈 시퀀스는 LFUnices 로만 구성 되기 때문에 파일은 Windows에서 온 것이어야합니다 .

파일이 Mac OS 9 또는 이전 시스템에서 가져온 경우 다음과 같이 표시됩니다.

라인 1 ^ M 라인 2 ^ M

캐리지 리턴 뒤에 줄 바꿈이 없기 때문입니다.


29

^ M이 git에서 사라지도록하려면 다음을 입력하십시오.

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
git diff를 사용할 때만 ^ M이 디스플레이
FernandoZ

1
실제로 ^ M을 공백으로 만 표시하지만 git diff파일을 비교할 때 ^ M을 고려합니다. 이 설정 제거 git config --global --unset core.whitespace(에서 이 스레드 ).
miguelmorin

1
를 생략 --global하여 현재 저장소를 구성 할 수도 있습니다 .
Derek Veit

8

DOS 스타일 라인 엔딩과 유닉스 스타일의 차이와 관련이 있습니다. Wikipedia 기사를 확인 하십시오 . 도움이되는 dos2unix 도구를 찾거나 간단한 스크립트를 작성하여 직접 수정할 수 있습니다.

편집 : 여기 에서 다음 Python 샘플 코드를 찾았습니다 .

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

3
Emacs에서는 <code> M- : (replace-string "\ r" "") </ code>입니다.
huaiyuan 2009

7

내가 사용하고 안드로이드 스튜디오 (JetBrains의 인 IntelliJ의 IDEA )에 맥 OS를 내 문제는 ^ M이 내 풀 요청에 일부 파일에 표시하기 시작했다 GitHub의 . 나를 위해 일한 것은 파일의 줄 구분 기호를 변경하는 것입니다.

편집기에서 원하는 파일을 열고 이동을 파일 로 이동 라인 구분은 다음 당신을위한 최고의 옵션을 선택 (나를 위해 그것이 LF - 유닉스와 OS X (\ n) )

다음 기사에 따르면이 문제는 운영 체제 간의 줄 끝이 혼동 된 결과입니다. http://jonathonstaff.com/blog/issues-with-line-endings/

더 많은 정보는 여기에서 찾을 수 있습니다 : https://www.jetbrains.com/help/idea/configuring-line-separators.html#d84378e48

여기에 이미지 설명 입력


6

query-replace 대신 Mx delete-trailing-whitespace를 사용할 수도 있습니다.


이것은 나를 위해 작동하지 않았습니다 ... 모든 텍스트를 선택하고 명령을 실행했습니다.
ᐅ devrimbaris 2014 년

이것은 나를 위해 일했습니다. 감사. @devrimbaris, 당신은 아무것도 선택할 필요가 없으며 단순히 명령을 실행하기 만하면됩니다. 'M'은 메타 키 또는 이스케이프 키입니다. 그래서 Mx는 탈출하고 x입니다. 그런 다음 delete-trailing-whitespace를 입력하고 return을 누릅니다.
astromax

5

당신의 ~/.emacs(또는 동등한)에 다음을 냄비

(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

^MEmacs에서 줄 끝은 캐리지 리턴 (\ r)과 줄 바꿈 (\ n)을 나타냅니다. 한 사람이 Windows에서 파일을 편집하고 (여기서 줄의 끝은 캐리지 리턴과 줄 바꿈 문자의 조합) Unix 또는 Linux에서 편집하는 경우 (줄의 끝은 줄 바꿈 문자 만 있음) 이러한 현상을 자주 볼 수 있습니다.

문자 조합은 일반적으로 해롭지 않습니다. 소스 제어를 사용하는 경우 라인이 마법처럼 조정되도록 텍스트 파일 체크인 형식을 구성 할 수 있습니다. 또는 파일을 자동으로 "수정"하는 체크인 및 체크 아웃 트리거를 사용할 수 있습니다. 또는 dos2unix 와 같은 도구를 사용 하여 수동으로 조정할 수도 있습니다 .


2

모두가 언급했듯이. 다른 라인 엔딩 스타일입니다. MacOSX는 Unix 줄 끝 (예 : LF (줄 바꿈))을 사용합니다.

Windows는 CR (캐리지 리턴) 및 LF (줄 바꿈)를 모두 줄 끝으로 사용합니다. Windows와 Mac을 모두 사용하고 있기 때문에 문제가 발생합니다.

Windows에서 파일을 만든 다음 Mac으로 가져 오면 줄 끝에 이러한 ^ M 문자가 표시 될 수 있습니다.

그것들을 제거하고 싶다면 emacs에서 매우 쉽게 할 수 있습니다. ^ M 문자를 강조 표시하고 복사 한 다음 쿼리를 수행하고 ^ M을로 바꾸면 완료됩니다.

편집 : 도움이 될 수있는 다른 링크. http://xahlee.org/emacs/emacs_adv_tips.html

이것은 특정 유형의 줄 끝 스타일을 사용하도록 emacs를 구성하는 데 도움이됩니다. http://www.emacswiki.org/emacs/EndOfLineTips


2

나는이 문제를 잠시 만났습니다. ^ M은 캐리지 리턴을 나타내며 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

file_from_PC.txt로 끝나는 줄에서 ^ M 문자를 제거합니다. 고양이를 사용하여 가지고 있는지 여부를 확인할 수 있습니다.

cat -v file_from_PC.txt


0

나를위한 해결책은이 Emacs Wiki 기사 에있는 다음과 같은 elisp 함수를 사용하는 것이 었습니다 .

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

M-x dos2unix버퍼 에서 기능 을 실행하고 파일을 저장하면 모두 ^M사라집니다.


0

emacs 명령 한 줄로 ^ M을 제거하는 가장 간단한 방법 중 하나 :

    C-x h C-u M-| dos2unix    

분석:

    C-x h: select current buffer
    C-u: apply following command as a filter, redirecting its output to replace current buffer
    M-| dos2unix: performs `dos2unix` [current buffer]

* nix 플랫폼에는 dos2unixMac ( brew)을 포함하여 즉시 사용 가능한 유틸리티 가 있습니다 . Windows에서도 널리 사용할 수 있습니다 (MSYS2, Cygwin, 사용자 기여 등).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.