Що це за ^ М, які постійно відображаються у моїх файлах у emacs?


157

Тому я думаю, що це може бути пов'язано з текстовим партнером, але ми працюємо в невеликій команді і у нас виникають проблеми з повнорозмірними конфліктами майже однакових файлів у git, оскільки до кожного рядка однієї гілки додається ^ M.

Що ^Mповинен робити цей загадковий персонаж і звідки він може з’явитися?

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

Хтось коли-небудь має це питання, що випливає з одного з них?


3
Чого варто: пошукайте "ctrl" замість ^
Броам

3
Більш важливим питанням є те, що ти збираєшся з цим робити? Швидше за все, Emacs не представляє їх. Ваша команда повинна вирішити, чи мають файли формату DOS (мати ^ M) або Unix формату (немає ^ M), і застосувати це.
Трей Джексон

Відповіді:


111

У git-config встановлено так, core.autocrlfщоб trueзробити git автоматично перетворювати закінчення рядків правильно для вашої платформи, наприклад, запустіть цю команду для глобального налаштування:

git config --global core.autocrlf true

6
Я думаю, що це найкраща відповідь, оскільки він відповідає на питання в контексті ОП, а саме git.
neontapir

У мене вже був "[core] \ n autocrlf = true" у моєму файлі "~ / .gitconfig", але він все ще дозволив мені "git clone code.google.com/p/pytomtom " з "^ m" символами ??? ??
Великий багатий

11
Ця відповідь ЛИШЕ застосовується, якщо вашою платформою є Windows! Якщо ви працюєте на Mac / Linux, "true" повинен стати "входом"! Див help.github.com/articles/dealing-with-line-endings і тут: stackoverflow.com/questions/9225599 / ...
К.-Майкл Айе

ПОПЕРЕДЖЕННЯ: ця відповідь потім пошкоджує безліч інших файлів, коли git неправильно "здогадується" про те, що закінчення рядків є неважливими та їх потрібно змінити. Це смертельно небезпечно для програмних проектів, де ці символи існують у файлі даних (так, мене спалило це, боляче не перерватися). Це жахливе рішення ІМХО.
Адам

@Adam Що саме порушує зміна закінчень рядків? Де у вас виникли проблеми під час роботи з даними? Це не повинно впливати ні на що, це просто інший спосіб позначити кінець рядка. Я просто дивуюсь.
MBI

97

Хтось неправильно перетворює свої рядкові символи .

Я припускаю, що це Windows, як вони люблять свій CRLF. Unix любить LF, а Mac любив CR, поки не було показано Unix способом.


12
Для уточнення: Mac використовував CR до версії 10 (OS X), тепер він використовує LF.
Mikael S

34
Я вважаю, що спосіб Windows є більш логічним, оскільки терміни CR та LF походять з часів друкарських машинок. Вам потрібно було зробити і те, і інше: Повернення перевезення, щоб отримати точку набору тексту до початку рядка, і канал стрічки для прокручування однієї лінії вниз. Класичний спосіб Mac OS (CR) на друкарській машинці просто продовжує перезаписувати той самий рядок. Шлях Unix (LF) на друкарській машинці виводитиме поетапний текст, поки ви не досягнете повної ширини сторінки. :)
Otherside

114
@ Інше: більш логічно лише в сенсі "ми хочемо наслідувати машинку". Я не можу почати розуміти, чому це вже навіть віддалено корисно.
Брайан Оуклі

29
@ Інше, чому б ви представляли щось із двома символами, коли його можна представити одним символом?
Матвій Г

13
@Matthew G: Все може бути представлено в одному персонажі, якщо багато хто з нас погодиться на це. Це означає, що ми повинні? Ми можемо вводити всі наші повідомлення без розділових знаків, великих літер і просто кожного речення в новому рядку, і кожен би зрозумів це. Це означає, що ми повинні? Справа не в тому, щоб "робити щось, тому що ми можемо". Це сказав, що я віддаю перевагу і НЧ.
jaffog

33

^Mє 0x0d, тобто символ повернення каретки. Якщо ваш дисплей виглядає так

рядок 1 ^ М
рядок 2 ^ М

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

Якби файл надходив із системи Mac OS 9 або попередньої версії, ви побачили б його як

рядок 1 ^ Mline 2 ^ M

тому що лінійних каналів після повернення перевезення не буде.


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/


1
нічого не змінює.
Vivex

3
що лише змушує ^ М зникнути з дисплея при використанні git diff, але він все ще є
FernandoZ

1
Дійсно, він відображає лише ^ M як пробіл, але git diffвсе ж враховує ^ M при порівнянні файлів. Видаліть це налаштування за допомогою git config --global --unset core.whitespaceцієї нитки ).
miguelmorin

1
Ви також можете опустити --globalпросто налаштування поточного репо.
Дерек Вейт

8

Вони пов'язані з різницею між закінченнями стилю DOS і стилем Unix. Перегляньте статтю у Вікіпедії . Можливо, ви зможете знайти інструмент dos2unix, який допоможе, або просто написати невеликий сценарій, щоб виправити їх самостійно.

Edit : я знайшов такий приклад коду Python тут :

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

3
У Emacs це буде <code> M-: (substitu-string "\ r" "") </code>.
huaiyuan

7

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

Відкрийте потрібний файл у редакторі, перейдіть до Файл, перейдіть до рядкових сепараторів, тоді виберіть найкращий варіант для вас (для мене це був LF - Unix та OS X (\ n) )

Згідно з наступною статтею ця проблема є наслідком заплутаних закінчень рядків між операційними системами: http://jonathonstaff.com/blog/isissue-with-line-endings/

І більше інформації ви можете знайти тут: https://www.jetbrains.com/help/idea/configuring-line-separators.html#d84378e48

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


6

замість заміни запитів ви також можете використовувати Mx delete-trailing-whitespace


це не спрацювало для мене ... Я вибрав увесь текст і запустив команду.
ᐅ devrimbaris

це працювало для мене. Дякую. @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

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

Поєднання символів зазвичай не шкідливо. Якщо ви використовуєте управління джерелом, можливо, ви зможете налаштувати формат реєстрації текстового файлу таким чином, щоб рядки були магічно налаштовані для вас. Крім того, ви можете використовувати тригери реєстрації та оформлення замовлення, які автоматично "виправлять" файли для вас. Або ви можете просто скористатися таким інструментом, як dos2unix, щоб налаштувати речі вручну.


2

Як усі згадували. Це інший стиль закінчення рядка. MacOSX використовує закінчення рядків Unix - тобто LF (подача рядків).

Windows використовує як CR (повернення каретки), так і LF (канал каналу) як закінчення рядка. Оскільки ви використовуєте і windows, і mac, звідки виникла проблема.

Якщо ви створите файл у Windows, а потім перенесіть його на mac, ви можете побачити ці ^ M символи в кінці рядків.

Якщо ви хочете їх видалити, ви можете зробити це дуже легко в emacs. Просто виділіть і скопіюйте символ ^ M і зробіть заміну ^ M на запит, і ви закінчили.

EDIT: Деякі інші посилання, які можуть бути корисними. 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. Ви можете перевірити, чи є у вас такі чи ні, скориставшись котом:

cat -v file_from_PC.txt

1

Дивитися також:

Ховається ^ М в емаках

Будьте обережні, якщо ви вирішите видалити ^ М символів і повторно подати свою команду. Вони можуть побачити файл без повернення перевезення.


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зникне.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.