^ M в кінці кожного рядка в vim


132

Під час редагування вихідних файлів за допомогою vim та інших редакторів іноді в кінці рядка я отримую ці ^ М символи в кінці кожного рядка. Я думаю, що це має щось спільне з редагуванням файлу у Windows, а потім у Linux. Як я можу видалити все це автоматично?


18
Це тому, що Windows використовує дво символьну послідовність (зазвичай пишеться "\ r \ n") для представлення розриву рядка, але UNIX / Linux використовує лише другий символ "\ n" для представлення розриву рядка. Отже, коли ви редагуєте текстовий файл Windows у редакторі Linux, редактор бачить зайві символи, які він не вважає частиною розривів рядків, тому він намагається вивести їх, і те, що виходить ^ M.
David Z

13
У цьому є трохи більше, ніж Девід. Vim із радістю буде редагувати текстовий файл із закінченнями рядка DOS, не показуючи всіх цих ^Ms. Єдина ознака у вас є при редагуванні текстового файлу DOS в Vim, якщо у вас є %{&ff}у вашій statuslineвартості опціону. Vim показує, ^Mколи стиль закінчення рядків змішаний . Це означає, що ви використовували текстовий редактор, не такий кмітливий, як Vim, який не дотримувався існуючого стилю закінчення рядків, як Vim за замовчуванням. Якщо ви використовуєте Vim або щось інше з його калібру в Windows, ви не отримаєте вирвані рядкові закінчення.
Warren Young

Відповіді:


128

Як команду введіть

:%s/^M$//

(Щоб отримати ^ M, натисніть ^ V ^ M, де ^ - CTRL на більшості клавіатур)


62
також:% s / \ r $ // щоб уникнути клопоту ^ V ^ M
glenn jackman

8
Або, зберігаючи характер::%s/\r$
sehe

2
@sehe технічно економить 2 персонажі :)
Кріс

@glennjackman, ваша порада була набагато простішою, тому що я намагався отримати ^ V + ^ M, якби це зовсім не відбувалося. Все, що я отримував, - це вміст у буфері обміну (оскільки ^ V був ефективним кожен раз, незважаючи на неодноразові спроби різних стратегій отримати їх обох).
itsraghz

86

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

:set ff=unix
:wq

Тепер ваш файл повернувся до старого-старого-Unix-шляху.

Якщо ви хочете додати закінчення рядків DOS (щоб підтримувати принтер щасливим або переносити файли з друзями Windows, які не мають приємних інструментів), ви можете легко піти в зворотному напрямку:

:set ff=dos
:wq

8
vim не знайшов жодного ^ m, або \ r або будь-якого іншого закінчення рядка, але це спрацювало. Дякую :)
SgtPooki

2
Vim не знайде жодного ^ М або \ r, але це працювало для мене! Дякуємо @sarnold
7ochem

здається, що git занадто німий, щоб виявити це як зміну одного символу. Я провів це у Vim, і git diffпоказує, що кожен рядок видалено та додано кожен рядок: /
Tommy

Томмі, це обмеження на diff, а не на git.
Spidey

34

Ви можете зробити це:

:set fileformats=dos

Він приховає ^M's, не торкаючись файлу.


17

Існує програма під назвою dos2unix, яка повинна знімати ці програми для вас. Windows використовує різні символи, що закінчуються рядками, тому це і відбувається.


6

Це працювало для мене у файлі, у якому все було в одному рядку:

Спочатку знайдіть усі сірники

:%s/^M//

(Щоб отримати ^M, натисніть ^ V ^ M, де ^ знаходиться Ctrlна більшості клавіатур)

Потім замініть на нові рядки

:%s//\r/g

Комбінована команда буде:

:%s/^M/\r/g

Дякую, цікаво, як насправді ввести Ctrl-M у пошуку-заміні!
Робопрог


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()

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