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

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

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

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

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


person Neil Sarkar    schedule 30.11.2009    source источник
comment
Для чего: ищите ctrl вместо ^   -  person Broam    schedule 01.12.2009
comment
Более серьезная проблема в том, что вы собираетесь с этим делать? Скорее всего, Emacs их не представляет. Ваша команда должна решить, должны ли файлы быть в формате DOS (иметь ^ M) или в формате Unix (без ^ M), и обеспечить соблюдение этого.   -  person Trey Jackson    schedule 01.12.2009


Ответы (15)


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

git config --global core.autocrlf true
person Josh Lee    schedule 30.11.2009
comment
Я думаю, что это лучший ответ, потому что он отвечает на вопрос в контексте OP, а именно git. - person neontapir; 22.01.2014
comment
У меня уже было [core] \ n autocrlf = true в моем файле '~ / .gitconfig', но он по-прежнему позволял мне 'git clone code.google.com/p/pytomtom 'с символами' ^ m '????? - person Big Rich; 17.03.2015
comment
Этот ответ ТОЛЬКО применим, если ваша платформа - Windows! Если вы работаете на Mac / Linux, значение true должно стать входным! См. help.github.com/articles/dealing-with-line-endings и здесь: stackoverflow.com/questions/9225599/ - person K.-Michael Aye; 05.05.2016
comment
ВНИМАНИЕ: этот ответ затем повреждает множество других файлов, когда git неправильно догадывается, что окончания строк не важны и их необходимо изменить. Это смертельно опасно для программных проектов, в которых эти символы существуют в файле данных (да, я был обожжен этим, трудно сломать). Ужасное решение ИМХО. - person Adam; 27.11.2017
comment
@Adam Что именно нарушает изменение концов строки? Где возникла проблема при работе с данными? Это ни на что не должно влиять, это просто другой способ отметить конец строки. Мне просто интересно. - person MBI; 06.02.2018
comment
@MBЯ думаю об этом; компьютер волшебным образом не знает, какой CRLF / LF является концом строки, а какой нет. Так что это их всех меняет. И если символ был там, но НЕ в конце строки ... вы просто испортили свои данные. - person Adam; 06.02.2018

Кто-то неправильно конвертирует символы окончания строки.

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

person Broam    schedule 30.11.2009
comment
Для пояснения: Mac использовал CR до версии 10 (OS X), теперь он использует LF. - person Mikael S; 01.12.2009
comment
Я считаю, что способ Windows более логичен, поскольку термины CR и LF пришли со времен пишущих машинок. Вам нужно было сделать и то, и другое: возврат каретки, чтобы переместить точку ввода в начало строки, и перевод строки для прокрутки на одну строку вниз. Классический способ Mac OS (CR) на пишущей машинке просто продолжал бы перезаписывать одну и ту же строку. Способ Unix (LF) на пишущей машинке выводит текст с шахматным расположением, пока вы не достигнете полной ширины страницы. :) - person Otherside; 01.12.2009
comment
@Otherside: более логично только в том смысле, что мы хотим подражать пишущей машинке. Я не могу понять, почему это даже отдаленно полезно. - person Bryan Oakley; 02.03.2010
comment
@Otherside, зачем вам представлять что-то двумя символами, если это может быть представлено одним символом? - person Matthew G; 08.04.2013
comment
@Matthew G: Все может быть представлено одним персонажем, если с этим согласны многие из нас. Значит ли это, что мы должны? Мы можем вводить все наши сообщения без знаков препинания, заглавных букв и просто каждое предложение с новой строки, и все это поймут. Значит ли это, что мы должны? Дело не в том, чтобы делать что-то потому, что мы можем. Тем не менее, я тоже предпочитаю LF. - person Michiel Bakker; 23.09.2014
comment
@Otherside более логично в 1958 году. Это не 1958 год. - person jcollum; 23.09.2014
comment
git config core.autocrlf = input (Linux и не конфликтует с Windows, протестировано в проекте с пользователями Linux и Windows на сервере Linux). Docu - person mrroot5; 24.02.2016
comment
@ С другой стороны, может быть еще несколько проблем с совместимостью, чем просто отсутствие или наличие CR, ср. youtube.com/watch?v=2XLZ4Z8LpEE - person JohnK; 08.05.2020

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

line 1^M
line 2^M

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

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

line 1^Mline 2^M

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

person Sinan Ünür    schedule 30.11.2009

Чтобы исчезнуть ^ 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/

person bonif    schedule 22.01.2018
comment
ничего не меняет. - person vivex; 12.02.2018
comment
это только заставляет ^ M исчезать с дисплея при использовании git diff, но он все еще там - person FernandoZ; 14.06.2018
comment
Действительно, он отображает только ^ M как пробел, но git diff по-прежнему учитывает ^ M при сравнении файлов. Удалите этот параметр с помощью git config --global --unset core.whitespace (из эту ветку). - person miguelmorin; 30.10.2018
comment
Вы также можете опустить --global, чтобы просто настроить текущее репо. - person Derek Veit; 31.03.2019
comment
СПАСИБО!!!!!! - person ThiagoAlves; 10.01.2021

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

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

string.replace( str, '\r', '' )
person Parappa    schedule 30.11.2009
comment
В Emacs это будет ‹code› M-: (replace-string \ r) ‹/code›. - person huaiyuan; 02.12.2009

Я использую Android Studio (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.

введите описание изображения здесь

person CookieMonster    schedule 06.12.2017

вместо замены запроса вы также можете использовать M-x delete-trailing-whitespace

person kaineer    schedule 01.12.2009
comment
это не сработало для меня ... Я выделил весь текст и выполнил команду. - person ᐅdevrimbaris; 28.01.2014
comment
это сработало для меня. благодаря. @devrimbaris, ничего выбирать не нужно, достаточно просто запустить команду. «M» - это мета-клавиша или клавиша выхода. Итак, M-x - это escape, затем x. Затем вы вводите delete-trailing-whitespace и нажимаете return. - person astromax; 22.04.2015

Положите следующее в свой ~/.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.

person Jakub Narębski    schedule 01.12.2009

^M в конце строки в Emacs указывает на возврат каретки (\ r), за которым следует перевод строки (\ n). Вы часто увидите это, если один человек редактирует файлы в Windows (где конец строки - это комбинация символов возврата каретки и новой строки), а вы редактируете в Unix или Linux (где конец строки - это только символ новой строки).

Комбинация символов обычно не вредна. Если вы используете систему управления версиями, вы можете настроить формат возврата текстового файла, чтобы строки волшебным образом корректировались для вас. Кроме того, вы можете использовать триггеры регистрации и оплаты, которые автоматически «исправят» файлы за вас. Или вы можете просто использовать такой инструмент, как dos2unix для ручной настройки.

person atk    schedule 30.11.2009

Как все уже упоминали. Это другой стиль окончания строки. 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

person hookenz    schedule 30.11.2009

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

M-x replace-string [ENTER] C-q C-m [ENTER] \n [ENTER]
person nedblorf    schedule 01.12.2009

Если в вашей системе не установлена ​​утилита 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
person grapesh    schedule 08.05.2018

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

Скрытие ^ M в emacs

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

person Demosthenex    schedule 08.01.2010

Один из самых простых способов избавиться от ^ Ms с помощью однострочника команды emacs:

    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 имеют встроенную утилиту dos2unix, включая Mac (с brew). Под Windows он также широко доступен (MSYS2, Cygwin, пользовательский, среди другие).

person Community    schedule 30.10.2020

Решением для меня было использование следующей функции 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 исчезнут.

person Carlo Rodriguez    schedule 16.07.2018