Что символ ^ M означает в Vim?

399

Я продолжаю получать символ ^M в своем vimrc, и это нарушает мою конфигурацию.

  • 31
    Кстати, это отличный ресурс.
  • 0
    @LightnessRacesinOrbit - Хм, теперь тоже работает с формами. Я отозвал свой комментарий, сказав, что ссылка мертва.
Показать ещё 4 комментария
Теги:
vim

15 ответов

457
Лучший ответ

Unix использует 0xA для символа новой строки. Windows использует комбинацию из двух символов: 0xD 0xA. 0xD - символ возврата каретки. ^M случается так, как vim отображает 0xD (0x0D = 13, M - 13-я буква в английском алфавите).

Вы можете удалить все символы ^M, выполнив следующее:

:%s/^M//g

Где ^M вводится путем удержания Ctrl и ввода v, за которым следует m, а затем отпускания Ctrl. Это иногда сокращается как ^V^M, но обратите внимание, что вы должны ввести его, как описано в предыдущем предложении, вместо того, чтобы печатать его буквально.

Это выражение заменит все вхождения ^M на пустую строку (т.е. ничего). Я использую это, чтобы избавиться от ^M в файлах, скопированных из Windows в Unix (Solaris, Linux, OSX).

  • 9
    На всякий случай, если вы работаете в Windows, Ctrl + V, вероятно, будет отображен для вставки. В этом случае значения по умолчанию переназначают «escape-код специального символа» на Ctrl + Q.
  • 6
    На самом деле вопрос в том, почему Vim иногда автоматически определяет окончания строк и правильно отображает их, а иногда нет.
Показать ещё 11 комментариев
103
:%s/\r//g 

работал у меня сегодня. Но моя ситуация, возможно, была несколько иной.

  • 1
    опция g не требуется, в каждой строке только одна новая строка. :%s/\r// будет достаточно.
  • 6
    Опция g вполне может потребоваться, потому что возврат каретки не обязательно является новой строкой. При открытии в режиме Unix возврат каретки является просто еще одним символом, а при открытии в режиме Windows возврат каретки только специальный, после которого следует перевод строки.
52

Чтобы перевести новую строку вместо ее удаления:

:%s/\r/\r/g
  • 1
    Что это на самом деле должно делать? Для меня это выглядит так, как будто он заменяет подобное, но я не могу себе представить, что это что-то изменит. Я что-то упускаю из-за того, как здесь работает синтаксис?
  • 28
    это вуду на самом деле работает
Показать ещё 4 комментария
36

Вероятно, это означает, что у вас есть возврат каретки (разные операционные системы используют разные способы сигнализации конца строки).

Используйте dos2unix для исправления файлов или установки файлов в vim:

set ffs=unix,dos
15

Скажем, ваш текстовый файл - file.txt, затем запустите эту команду -

dos2unix file.txt 

Он преобразует текстовый файл из формата dos в unix.

5

В Unix, вероятно, проще использовать команду "tr".

cat file1.txt | tr "\r" "\n" > file2.txt
5

Я удалил их всех с sed:

sed -i -e 's/\r//g'

Также можно заменить другой строкой или символом:

sed -i -e 's/\r/string/g'

4

Я получил текстовый файл, первоначально созданный на Windows-машине, с помощью пользователя Mac и необходимый для его импорта в базу данных Linux MySQL с помощью команды load data.

Хотя VIM отображал символ "^ M", ни одна из вышеперечисленных проблем не работала для моей конкретной проблемы, данные импортировались, но были каким-то образом повреждены. Решение было довольно легко в конце (после большого разочарования).

Решение: Выполнение dos2unix TWICE в том же файле сделало трюк! Использование команды file показывает, что происходит на этом пути.

$ file 'file.txt'
file.txt: ASCII text, with CRLF, CR line terminators

$ dos2unix 'file.txt'
dos2unix: converting file file.txt to UNIX format ...
$ file 'file.txt'
file.txt: ASCII text, with CRLF line terminators

$ dos2unix 'file.txt'
dos2unix: converting file file.txt to UNIX format ...
$ file 'file.txt'
file.txt: ASCII text

И окончательная версия файла прекрасно импортируется в базу данных.

4

Вы можете исправить это в vim, используя

:1,$s/^V^M//g

где ^ - управляющий символ.

  • 2
    Это не объясняет, что такое ^M
  • 2
    Он на самом деле не спрашивает, что это, он спрашивает, как это исправить. Это символ возврата каретки из DOS.
Показать ещё 2 комментария
2

В FreeBSD вы можете очистить ^M вручную, введя следующее:

:%s/ Ctrl + V, затем Ctrl + M, затем Ctrl + M снова.

2

Если это нарушает вашу конфигурацию, а символы ^ М требуются в сопоставлениях, вы можете просто заменить символы ^ М на <Enter> или даже <C-m> (оба набраны как простые последовательности символов, поэтому 7 и 5 символов, соответственно).

Это единственный рекомендуемый переносимый способ хранения специальных кодов клавиш в сопоставлениях

1

Это единственное, что сработало в моем случае:

:e ++ff=dos

:wq

0

Если вы не указали другой fileformat намеренно (скажем, :e ++ff=unix для файла Windows), вероятно, что целевой файл имеет смешанные EOL.

Например, если файл имеет несколько строк с концами <CR><NL>, а другие - с <NL>, а fileformat автоматически устанавливается на unix автоматически Vim при чтении, ^M (<CR>) появится. В таких случаях вступает в игру fileformats. Подробнее см. :help ffs.

0

try :%s/\^M// По крайней мере, это сработало для меня.

0

Я обнаружил, что я загрязнял файлы в течение нескольких недель из-за того, что мой экземпляр Mvim в Homebrew был настроен на использование filetype = dos. Сделал требуемое изменение в .vimrc....

Ещё вопросы

Сообщество Overcoder
Наверх
Меню