^ M в конце каждой строки в vim

132

Когда я редактирую исходные файлы с помощью vim и других редакторов, иногда в конце строки я получаю эти символы ^ M в конце каждой строки. Я думаю, что это как-то связано с редактированием файла в Windows, а затем в Linux. Как я могу удалить все это автоматически?

DHamrick
источник
18
Это потому, что Windows использует двухсимвольную последовательность (обычно пишется «\ r \ n») для обозначения разрыва строки, но UNIX / Linux использует только второй символ «\ n» для обозначения разрыва строки. Поэтому, когда вы редактируете текстовый файл Windows в редакторе Linux, редактор видит лишние символы, которые он не учитывает как часть разрывов строк, поэтому он пытается их отобразить, и в результате получается ^ M.
David Z
13
Есть еще кое-что, Дэвид. Vim с радостью отредактирует текстовый файл с окончанием строки DOS, не показывая все эти ^Mсимволы. Единственный признак у вас есть при редактировании текстового файла DOS в Vim, если у вас есть %{&ff}в вашей statuslineстоимости опциона. Vim показывает смешанный^M стиль окончания строки . Это означает, что вы использовали текстовый редактор, который не так сообразителен, как Vim, который не следовал существующему стилю окончания строки, как Vim по умолчанию. Если вы используете Vim или что-то еще такого же калибра в Windows, вы не получите таких окончаний строк.
Уоррен Янг
1
возможный дубликат Convert DOS line endings to Linux line
endings

Ответы:

128

В качестве команды введите

:%s/^M$//

(Чтобы получить ^ M, нажмите ^ V ^ M, где ^ - это CTRL на большинстве клавиатур)

Тобиас Бааз
источник
62
также:% s / \ r $ // чтобы избежать
неприятностей
8
Или, спасая персонажа::%s/\r$
sehe 05
2
@sehe технически сохраняет 2 символа :)
Крис,
@glennjackman, ваш совет был намного проще, так как я изо всех сил пытался получить ^ V + ^ M, хотя этого вообще не было. Все, что я получал, - это содержимое в буфере обмена (поскольку ^ V действовал каждый раз, несмотря на мои неоднократные попытки получить их обе с разными стратегиями).
itsraghz
86

Один из простых способов вырезать окончания строк DOS - использовать ffопцию:

:set ff=unix
:wq

Теперь ваш файл вернулся к старому-доброму Unix-образу.

Если вы хотите добавить окончания строк DOS (чтобы принтер был доволен или передавайте файлы друзьям из Windows, у которых нет хороших инструментов), вы можете легко пойти в противоположном направлении:

:set ff=dos
:wq
sarnold
источник
8
vim не нашел ни ^ m, ни \ r, ни других окончаний строк, но это сработало. Спасибо :)
SgtPooki
2
Vim не нашел ни ^ M, ни \ r, но у меня это сработало! Спасибо @sarnold
7ochem
Казалось бы, git слишком тупой, чтобы обнаружить это как изменение одного символа. Я запустил это в Vim и git diffпоказывает, что каждая строка удалена и каждая строка добавлена: /
Tommy
Томми, это ограничение diff, а не ограничение git.
Spidey
34

Ты можешь сделать это:

:set fileformats=dos

Он скроет ^M's, не касаясь файла.

jqno
источник
17

Есть программа под названием dos2unix, которая должна удалить их за вас. Windows использует разные символы окончания строки, поэтому так и происходит.

Адам Лассек
источник
6

Это сработало для меня в файле, в котором все было в одной строке:

Сначала найдите все совпадения

:%s/^M//

(Чтобы получить ^M, нажмите ^ V ^ M, где ^ Ctrlна большинстве клавиатур)

Затем замените новой строкой

:%s//\r/g

Комбинированная команда будет:

:%s/^M/\r/g
TheRealKingK
источник
Спасибо, интересно, как на самом деле ввести Ctrl-M в поиск-замену!
Робопрог 03
2

Я обычно просматриваю пораженные файлы fromdosперед тем, как открывать их снова. fromdosявляется частью пакета tofrodos .

Тед Персиваль
источник
1

Причина проблемы могла быть в передаче по FTP. Когда вы отправляете эти файлы по FTP из одного ящика в другой, обязательно используйте передачу ASCII. Используйте команду «ASC».

Спенсер Рупорт
источник
0
" put this in your ~/.vimrc file and :source ~/.vimrc
" then you can do: Dos2Unix
" dos2unix ^M
fun! Dos2unixFunction()
    let _s=@/
    let l = line(".")
    let c = col(".")
    try
        set ff=unix
        w!
        "%s/\%x0d$//e
    catch /E32:/
        echo "Sorry, first save the file."
    endtry
    let @/=_s
    call cursor(l, c)
endfun
com! Dos2Unix keepjumps call Dos2unixFunction()
SergioAraujo
источник
0

mcedit: shift + f2, установить формат unix (LF), ок

Василий Чапаев
источник