Что это за ^ M, которые продолжают появляться в моих файлах в emacs?

157

Так что я думаю, что это может быть связано с textmate, но мы работаем в небольшой команде, и у нас возникают некоторые проблемы с конфликтами полных файлов почти идентичных файлов в git, потому что к каждой строке одной ветви добавляется ^ M.

Что ^Mдолжен делать этот таинственный персонаж и откуда он может взяться?

Наши разработчики используют emacs для Windows / Mac, TextMate для Mac, coda для Mac и иногда текстовый редактор wp-admin.

У кого-нибудь когда-нибудь была эта проблема, вытекающая из одного из них?

Нил Саркар
источник
3
Для чего это стоит: поиск "Ctrl" вместо ^
Broam
3
Большая проблема в том, что вы собираетесь с этим делать? Скорее всего, Emacs не представляет их. Ваша команда должна решить, должны ли файлы быть в формате DOS (иметь ^ M) или Unix (без ^ M), и применить это.
Трей Джексон

Ответы:

111

В git-config установите core.autocrlfдля того, trueчтобы git автоматически преобразовывал окончания строк для вашей платформы, например, запустите эту команду для глобальной настройки:

git config --global core.autocrlf true
Джош Ли
источник
6
Я думаю, что это лучший ответ, потому что он отвечает на вопрос в контексте OP, а именно git.
Неонтапир
У меня уже было «[core] \ n autocrlf = true» в моем файле «~ / .gitconfig», но оно все же позволило мне «git clone code.google.com/p/pytomtom » с символами «^ m» ??? ??
Большой Рич
11
Этот ответ применяется ТОЛЬКО если ваша платформа Windows! Если вы работаете на Mac / Linux, «true» должно стать «input»! См. Help.github.com/articles/dealing-with-line-endings и здесь: stackoverflow.com/questions/9225599/…
К.-Майкл Ай
ВНИМАНИЕ: этот ответ затем повреждает множество других файлов, когда git неправильно «догадывается», что окончания строк не важны и требуют изменения. Это смертельно для программных проектов, в которых эти символы присутствуют в файле данных (да, меня это сожгло, больно ломать). Это ужасное решение ИМХО.
Адам
@Adam Что именно нарушает смену концов строк? Где у вас были проблемы при работе с данными? Это ни на что не должно влиять, это просто другой способ обозначить конец строки. Мне просто интересно.
MBI
97

Кто-то неправильно преобразовывает свои символы конца строки .

Я предполагаю, что это люди Windows, поскольку они любят свой CRLF. Unix любит LF, а Mac любил CR до тех пор, пока ему не показали путь Unix.

Broam
источник
12
Для пояснения: Mac использовал CR до версии 10 (OS X), теперь он использует LF.
Микаэль С
34
Я чувствую, что способ Windows более логичен, так как термины CR и LF происходят со времен пишущих машинок. Вы должны были сделать и то и другое: возврат каретки, чтобы получить точку набора текста в начале строки, и перевод строки, чтобы прокрутить одну строку вниз. Классический способ Mac OS (CR) на пишущей машинке будет просто перезаписывать одну и ту же строку. Способ Unix (LF) на пишущей машинке будет выводить разнесенный текст, пока вы не достигнете полной ширины страницы. :)
Otherside
114
@ Другая сторона: более логично только в смысле «мы хотим подражать пишущей машинке». Я не могу понять, почему это даже отдаленно полезно.
Брайан Оукли
29
@ С другой стороны, почему вы представляете что-то двумя символами, если это можно представить одним символом?
Мэтью G
13
@ Мэтью G: Все может быть представлено в одном символе, пока многие из нас соглашаются с этим. Значит ли это, что мы должны? Мы можем напечатать все наши сообщения без знаков препинания, заглавных букв и просто каждого предложения в новой строке, и все это поймут. Значит ли это, что мы должны? Дело не в том, чтобы «делать что-то, потому что мы можем». Тем не менее, я предпочитаю LF, а также.
Jaffog
33

^Mесть 0x0d, то есть символ возврата каретки. Если ваш дисплей выглядит

линия 1 ^ M
строка 2 ^ M

тогда файл должен быть получен из Windows, потому что стандартная последовательность новой строки в Windows - это CR LF( 0x0d 0x0a), тогда как стандартная последовательность новой строки состоит исключительно из LFUnices.

Если файл пришел из системы Mac OS 9 или более ранней версии, вы увидите его как

линия 1 ^ Млайн 2 ^ М

потому что после возврата каретки не будет перевода строки.

Синан Юнюр
источник
28

Чтобы ^ 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/

bonif
источник
1
ничего не меняет.
Vivex
3
это только заставляет ^ M исчезать с дисплея при использовании git diff, но оно все еще там
FernandoZ
1
Действительно, он отображает только ^ M в качестве пробела, но git diffвсе равно учитывает ^ M при сравнении файлов. Удалить эту настройку с помощью git config --global --unset core.whitespace(из этой темы ).
Мигельморин
1
Вы также можете опустить, --globalчтобы просто настроить текущий репо.
Дерек Вейт
8

Они связаны с различием между окончаниями линий в стиле DOS и стилем Unix. Проверьте статью в Википедии . Вы можете найти инструмент dos2unix, чтобы помочь, или просто написать небольшой скрипт, чтобы исправить их самостоятельно.

Изменить : я нашел следующий пример кода Python здесь :

string.replace( str, '\r', '' )
Parappa
источник
3
В Emacs это будет <code> M-: (replace-string "\ r" "") </ code>.
Хуайюань
7

Я использую Android Studio (JetBrains IntelliJ IDEA ) в Mac OS, и моя проблема заключалась в том, что ^ M начало появляться в некоторых файлах в моем запросе на загрузку на GitHub . Для меня сработало изменение разделителя строк для файла.

Откройте нужный файл в редакторе идти к File идти к линии Сепараторы затем выбрать лучший вариант для вас (для меня это было LF - Unix и OS X (\ п) )

Согласно следующей статье, эта проблема является результатом запутанных окончаний строк между операционными системами: 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

kaineer
источник
у меня это не сработало ... Я выделил весь текст и выполнил команду.
ᐅ devrimbaris
это сработало для меня. Спасибо. @devrimbaris, вам не нужно ничего выбирать, вы просто запускаете команду. «М» - это мета-ключ или управляющий ключ. Так что Mx - это escape, тогда x. Затем вы вводите delete-trailing-whitespace и нажимаете 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 указывает возврат каретки (\ r), за которым следует перевод строки (\ n). Вы часто будете видеть это, если один человек редактирует файлы в Windows (где конец строки - комбинация символов возврата каретки и перевода строки), и вы редактируете в Unix или Linux (где конец строки - только символ новой строки).

Сочетание символов обычно не вредно. Если вы используете систему контроля версий, возможно, вы сможете настроить формат регистрации текстового файла так, чтобы строки волшебным образом настраивались для вас. Кроме того, вы можете использовать триггеры checkin и checkout, которые автоматически «исправят» файлы за вас. Или вы можете просто использовать такой инструмент, как 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

Matt
источник
2

Я столкнулся с этой проблемой некоторое время назад. ^ M представляет возврат каретки, а поиск по Ctrl-Q Ctrl-M(создает литерал ^ M) позволит вам получить указатель на этот символ в Emacs. Я сделал что-то вроде этого:

M-x replace-string [ENTER] C-q C-m [ENTER] \n [ENTER]
nedblorf
источник
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
grapesh
источник
1

Смотрите также:

Сокрытие ^ M в Emacs

Будьте осторожны, если вы решите удалить символы ^ M и повторно отправить свою команду. После этого они могут увидеть файл без возврата каретки.

Demosthenex
источник
0

Решением для меня было использовать следующую функцию elisp, описанную в этой статье Emacs Wiki .

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

Выполните функцию M-x dos2unixв буфере и сохраните файл, все ^Mисчезнет.

Карло Родригес
источник