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

500

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

Максимум
источник
35
Кстати, это отличный ресурс.
Гонки легкости на орбите
@LightnessRacesinOrbit - Хм, теперь тоже работает с формами. Я отозвал свой комментарий, сказав, что ссылка мертва.
ArtOfWarfare
3
Зеркало для ссылки @LightnessRacesinOrbit, которая в данный момент недоступна
alexpls
4
Печатание :digraphsв vim показывает таблицу-график, с которой связана @LightnessRacesinOrbit.
Askewchan
1
При попытке заменить этот тип персонажа с помощью php, попробуйте это preg_replace('/[\x01]/', ' ' ,$str); Надеюсь, это поможет.
Рэйчел Геллер,

Ответы:

561

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.
Р. Мартиньо Фернандес
8
На самом деле вопрос в том, почему Vim иногда автоматически определяет окончания строк и правильно отображает их, а иногда нет.
Скотт
10
Вы увидите ^Mсимвол, если файл не соответствует концу строки. Используйте команду, предоставленную Tomasz, затем введите, в :fileformat={unix|dos|mac}зависимости от того, на какую ОС вы ориентируетесь. Если есть только несколько строк без ^Mсимвола, вы, вероятно, хотите :fileformat=dos. Если вы редактируете файлы в редакторе, отличном от vim, убедитесь, что он настроен на совпадение с окончанием строки (Блокнот этого не сделает, но подойдет любой уважаемый редактор, например Notepad ++ или TextMate).
Миккель Полсон,
9
Примечание для начинающих vi: эту команду нужно вводить вручную. Просто вставив его в открытый терминал с viзапущенным, вы получите ошибку «шаблон не найден».
IQAndreas
51
@bluesm Я действительно должен был использовать, :%s/\r//gчтобы заменить возврат каретки в моем файле. Не удалось найти шаблон ^ V ^ M в файле, в котором была куча символов ^ M.
jonnybot
140
:%s/\r//g 

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

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

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

:%s/\r/\r/g
Mori
источник
2
Что это на самом деле должно делать? Для меня это выглядит так, как будто он заменяет подобное, но я не могу себе представить, что это что-то изменит. Я что-то упускаю из-за того, как здесь работает синтаксис?
Платиновая Лазурь
16
@PlatinumAzure Я не знаю, почему никто никогда не думал ответить на ваш вопрос. \rимеет другое поведение в поисковой части по сравнению с заменой. См. Например, stackoverflow.com/a/3834303 .
Или :%s/^V^M/^V^M/g смотрите здесь
августа
@TomD Ссылка указывает на ответ, который вы комментируете.
bzeaman
Для меня это заменило надоедливых персонажей дополнительным переводом строки. @ dlk5730 ответ работал лучше для меня. то есть:%s/\r//g
marcusshep
37

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

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

set ffs=unix,dos
cnicutar
источник
19

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

dos2unix file.txt 

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

akritaag
источник
Работает отлично!
robe007
9

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

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

Решение: выполнение dos2unix ДВАЖДЫ на одном и том же файле сделало свое дело! Использование 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

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

Энтони Палмер
источник
9

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

cat file1.txt | tr "\r" "\n" > file2.txt
Ирвинг Рабин
источник
9

Я удалил их все с помощью sed:

sed -i -e 's/\r//g' <filename>

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

sed -i -e 's/\r/string/g' <filename>

Эти sedкоманды работают в версии GNU / Linux, sedно могут потребовать настройки на BSD (включая macOS).

Freedom_Ben
источник
4

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

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

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

Скотт К Уилсон
источник
2
Это не объясняет, что ^Mесть.
Гонки легкости на орбите
2
Он на самом деле не спрашивает, что это, он спрашивает, как это исправить. Это символ возврата каретки из DOS.
Скотт С. Уилсон
3
Я знаю что это. Название вопроса: «Что означает символ ^ M в Vim».
Гонки легкости на орбите
3

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

:e ++ff=dos

:wq

Сардип Лахера
источник
2

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

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

sehe
источник
2

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

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

Виктор Онг
источник
1

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

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

EBK
источник
0

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

nichg
источник
0

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

xuc
источник