views:

523

answers:

10

So I think it may have to do with textmate, but we work in a small team and are having some issues with full-file conflicts of nearly identical files in git because each line of one branch has a ^M appended to it.

I would just google it, but since google searches strip special characters like ^ I am coming to you guys for help on this.

What is this mysterious ^M character supposed to do, and where could it be coming from? Our developers use emacs on windows/mac, textmate on mac, coda on mac, and occasionally the wp-admin text editor...anybody ever have this issue stemming from one of those?

+6  A: 

They have to do with the difference between DOS style line endings and Unix style. Check out the Wikipedia article. You may be able to find a dos2unix tool to help, or simply write a small script to fix them yourself.

Edit: I found the following Python sample code here:

string.replace( str, '\r', '' )
Parappa
In Emacs, that would be <code>M-: (replace-string "\r" "")</code>.
huaiyuan
In vim it can be done with :%s/\r//g
Parappa
+8  A: 

Someone is not converting their line-ending characters correctly.

I assume it's the Windows folk as they love their CRLF. Unix loves LF and Mac loved CR until it was shown the Unix way.

Broam
For clarification: Mac used CR until version 10 (OS X), now it uses LF.
Mikael S
I feel that the Windows way is more logical, since the terms CR and LF come from the days of typewriters. You did have to do both: a Carriage Return to get the typing point to the start of the line and a Line Feed to scroll one line down.The Mac OS Classic way (CR) on a typewriter would just keep overwriting the same line.The Unix way (LF) on a typewriter would output staggered text until you reached the full width of the page.:)
Otherside
@Otherside: more logical only in the "we want to emulate a typewriter" sense. I can't begin to understand why that is even remotely useful anymore.
Bryan Oakley
+5  A: 

In git-config, set core.autocrlf to true to make git automatically convert line endings correctly for your platform.

jleedev
+5  A: 

^M is 0x0d, i.e. the carriage return character. If your display looks like

line 1^M
line 2^M

then the file must have come from Windows because the standard newline sequence on Windows is CR LF (0x0d 0x0a) whereas the standard newline sequence consists solely of LF on Unices.

If the file had come from a Mac OS 9 or earlier system, you would see it as

line 1^Mline 2^M

because there would be no line feeds following the carriage returns.

Sinan Ünür
+3  A: 

^M at the end of line in Emacs is indicating a carriage return followed (\r) by a line feed (\n). You'll often see this if one person edits files on Windows (where end of line is the combination of carriage return and newline characters) and you edit in Unix or Linux (where end of line is only a newline character).

The combination of characters is usually not harmful. If you're using source control, you may be able to configure the text file checkin format so that lines are magically adjusted for you. Alternatively, you may be able to use checkin and checkout triggers that will automatically "fix" the files for you. Or, you might just use a tool like dos2unix to manually adjust things.

atk
+1  A: 

As everyone has mentioned. It's different line ending style. MacOSX uses Unix line endings - i.e. LF (line feed).

Windows uses both CR (carriage return) & LF (line feed) as a line ending. Since you're using both windows and mac thats where the problem stems from.

If you create a file in windows and then bring it onto the mac you might see these ^M characters at the end of the lines.

If you want to remove them you can do this very easily in emacs. Just highlight and copy the ^M character and do a query-replace ^M with and you'e done.

EDIT: Some other links that may be of help. http://xahlee.org/emacs/emacs%5Fadv%5Ftips.html

This one helps you configure emacs to use a particular type of line-ending style. http://www.emacswiki.org/emacs/EndOfLineTips

Matt H
+3  A: 

instead of query-replace you may also use M-x delete-trailing-whitespace

kaineer
+2  A: 

Pot the following in your ~/.emacs (or 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 "")))

and then you would be able to simply use M-x dos2unix.

Jakub Narębski
A: 

I ran into this issue a while back. The ^M represents a Carriage Return, and searching on Ctrl-Q Ctrl-M (This creates a literal ^M) will allow you get a handle on this character within Emacs. I did something along these lines:

M-x replace-string [ENTER] C-q C-m [ENTER] \n [ENTER]
nedblorf
+1  A: 

See also:

http://stackoverflow.com/questions/730751/hiding-m-in-emacs

Be careful if you choose to remove the ^M characters and resubmit to your team. They may see a file without carriage returns afterward.

Demosthenex