Що означає ^ М символ у Vim?


500

Я продовжую отримувати ^Mхарактер у своєму vimrc, і це порушує мою конфігурацію.


35
До речі, це чудовий ресурс.
Гонки легкості на орбіті

@LightnessRacesinOrbit - Гм, він працює і зараз. Я відкликав свій коментар, кажучи, що посилання загинула.
ArtOfWarfare

3
Дзеркало для посилання @LightnessRacesinOrbit, яке наразі не працює: fifi.org/doc/vim/html/digraph.html#digraph-table
alexpls

4
Введення тексту :digraphsvim показує таблицю з диграфом, до якої @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, ймовірно, буде відображено для вставки. Якщо це так, за замовчуванням перезаписуйте клавішу "втеча спеціального символу", натисніть її на 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 не вдалося знайти у файлі, в якому я мав купу символів ^ М.
jonnybot

139
:%s/\r//g 

працював для мене сьогодні. Але моя ситуація, можливо, була дещо іншою.


1
опція g не потрібна, є лише один новий рядок на рядок. :%s/\r//вистачило б
frogcoder

7
Варіант g може бути дуже потрібним, оскільки повернення вагона не обов'язково є новою лінією. Після відкриття в режимі Unix повернення каретки є лише іншим символом, а коли відкривається в режимі Windows, повернення каретки є лише спеціальним, одразу ж подається подача рядків.
Джонатан Болдуін

65

Щоб перекласти новий рядок, а не видаляти його:

:%s/\r/\r/g

2
Що це насправді повинно робити? Мені це здається, що це робить заміну типу «на подібне», яке, я не можу уявити, змінить щось. Я пропускаю щось особливе в тому, як тут працює синтаксис?
Platinum Azure

16
@PlatinumAzure Я не знаю, чому ніхто ніколи не думав відповісти на ваше запитання. \rмає різну поведінку в пошуковій частині порівняно із заміною. Дивіться, наприклад, stackoverflow.com/a/3834303 .

Або :%s/^V^M/^V^M/g дивіться тут
tomd

@TomD Посилання стосується відповіді, яку ви коментуєте.
bzeaman

Для мене це замінило дратівливих персонажів додатковим новим рядком. @ dlk5730 відповідь працювала краще для мене. тобто:%s/\r//g
marcusshep

37

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

Використовуйте dos2unixдля виправлення файлів або встановлення форматів файлів у vim:

set ffs=unix,dos

19

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

dos2unix file.txt 

Він перетворює текстовий файл з дос в формат Unix.


Працює чудово!
robe007

9

У мене з'явився текстовий файл, спочатку створений на машині Windows, користувачем Mac, і його потрібно було імпортувати в Linux MySQL DB за допомогою 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

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



9

Я видалив їх усіх sed:

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

Можна також замінити іншим рядком або символом:

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

Ці sedкоманди працюють над версією GNU / Linux, sedале можуть знадобитися налаштування на BSD (включаючи macOS).


4

Ви можете це виправити в програмі vim

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

де ^ - символ управління.


2
Це не пояснює, що ^Mтаке.
Гонки легкості по орбіті

2
Він насправді не питає, що це таке, він запитує, як це виправити. Що це - характер повернення вагона від DOS.
Скотт C Вілсон

3
Я знаю, що це таке. Назва запитання - «Що означає ^ М символ у Vim».
Гонки легкості на орбіті


2

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

Це єдиний рекомендований, портативний спосіб зберігання спеціальних клавішних кодів у відображеннях


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деталі.


0

Я виявив, що тижнями я забруднював файли через те, що мій екземпляр Homebrew Mvim був налаштований на використання файлу = dos. Внесла необхідні зміни в .vimrc ....


0

спробуйте, :%s/\^M//принаймні, це працювало для мене.

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