Что Visual Studio подразумевает под нормализацией несовместимых окончаний строк?

238

Visual Studio иногда говорит мне:

Окончания строк в следующих файлах не согласованы. Вы хотите нормализовать окончания строк?

Затем он дает мне раскрывающийся список с другими стандартами или чем-то вроде Windows, Mac, Unix и нескольких Unicode.

Что это значит и что произойдет, если я нажму Yes?

MetaGuru
источник
Visual Studio показывает мне то же самое сообщение, но «файл», на который он ссылается, фактически является папкой! Что это значит?!
полковник Паника
Я сделал небольшую утилиту, чтобы сделать это для всего каталога или рекурсивно через набор каталогов для всех файлов с определенным расширением (например, * .c или * .h), хотя я использую Delphi, утилита работает для любого исходного кода Windows файлы. Исходный код включен плюс бинарный (exe). Он сообщит, какие строки имеют дополнительные переводы строк (например, отсутствуют возвраты каретки) или дополнительные возвраты каретки (например, пропущены переводы строки). docs.google.com/file/d/0B07SrKpE8ErmbHZ1SWkxT3RLczA/…
Уоррен П
1
Может быть вызвано git. См. Также: stackoverflow.com/questions/170961/…
Джесс
2
У них должна быть опция в раскрывающемся списке, которая гласит: «предпочитайте наиболее распространенный тип окончания строки из остальной части файла / проекта».
MetaGuru

Ответы:

213

Обычно это означает, что у вас есть строки, заканчивающиеся чем-то отличным от пары возврата каретки / перевода строки. Это часто происходит, когда вы копируете и вставляете веб-страницу в редактор кода.

Нормализация окончаний строки - это просто проверка соответствия всех символов окончания строки. Он не позволяет одной строке оканчиваться на \r\nдругой, а другой оканчивается на \rили \n; первая - это пара концов Windows, в то время как остальные обычно используются для файлов Mac или Linux.

Поскольку вы разрабатываете в Visual Studio, вам, очевидно, захочется выбрать «Windows» из выпадающего списка. :-)

Кен Уайт
источник
1
как заканчивается строка без возврата каретки ...?
MetaGuru
23
Итак, почему флип делает визуальную студию безразличным, как заканчиваются строки, он, очевидно, распознает все различные типы, он должен быть просто счастлив и заткнуться.
MetaGuru
53
Ах, но что, если вы просто используете VS, чтобы починить что-то не для Windows? Быстрое исправление в утилите Linux или в простом C / C ++, и вы не хотите добавлять CRLF? Подождите, теперь вы хотите, чтобы MS прочитала ваши мысли и знала, что использовать? <g> Команда VS не права в любом случае, не так ли? Sheesh!
Кен Уайт
6
Ох, Кен, вы правы, если мне случится редактировать некоторые файлы, которые я планирую скомпилировать в Linux, и я знаю, что компилятор захлебнется и умрет, если у него не будет точно нужного конца строки, тогда у меня будет был рад против позвольте мне выбрать ... СПАСИБО!
MetaGuru
19
Проблема не в том, что VS не может справиться с окончаниями строк Unix - это возможно. Предупреждение говорит о том, что окончания строк несовместимы - то есть некоторые строки в файле являются CRLF, а некоторые - LF. VS справится с этим, но другие приложения в вашей цепочке инструментов могут не справиться, поэтому предупреждает вас. Если вас это не волнует, отключите предупреждение: «Параметры» -> «Среда» -> «Документы» -> «Проверить согласованность концов строк под нагрузкой». Это предупреждение может быть очень полезным, если вы работаете с продуктами на разных платформах.
the_mandrill
75

Некоторые строки заканчиваются на \n.

Некоторые другие строки заканчиваются на \r\n.

Visual Studio предлагает сделать все строки одинаковыми.

Алекс Рейтборт
источник
40

Если вы используете Visual Studio 2012:

Перейдите в меню « Файл» → « Дополнительные параметры сохранения» → выберите тип окончания строки как Windows (CR LF) .

Панкай
источник
1
Этот параметр не отображается в меню «Файл» для Visual Studio 2010 Ultimate версии 10.0.40219.1 SP1Rel.
DOK
1
@ DOK, в моем меню «Файл» в Visual Studio 2010 Premium версия это делает !!
Питер
4
Если вы не видите эту опцию, вы можете настроить свое файловое меню, перейдя в Tools-> Customize, перейдя на вкладку команд и добавив команду.
Роб
Существует ли общая настройка, которая влияет на все файлы вместе? Это боль сделать это для всех источников в рамках решения.
Клаус
12

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

ИнструментыПараметрыСредаДокументыПроверить согласованность концов строк под нагрузкой.

CodingYoshi
источник
7

Файл, который вы редактируете, был отредактирован с помощью другого редактора, который не использует те же окончания строк, что привело к созданию файла со смешанными окончаниями строк.

Символы ASCII, используемые для окончаний строк:

CR, возврат каретки
LF, перевод строки

Windows = CRLF
Mac OS 9 или более ранняя версия = CR
Unix = LF

monowerker
источник
6

Новая статья в Википедии может вам помочь. Вот выдержка:

Различные соглашения новой строки часто приводят к некорректному отображению текстовых файлов, которые были переданы между системами разных типов. Например, файлы, созданные в системах Unix или Apple Macintosh, могут отображаться в виде одной длинной строки в некоторых программах, работающих в Microsoft Windows. И наоборот, при просмотре файла, происходящего с компьютера Windows в системе Unix, дополнительный CR может отображаться как ^ M или в конце каждой строки, или как разрыв второй строки.

Ричард Эв
источник
5

Это означает, что, например, некоторые из ваших строк текста с <Carriage Return><Linefeed>(стандарт Windows), а некоторые заканчиваются просто <Linefeed>(стандарт Unix).

Если вы нажмете «да», эти строки в вашем исходном файле будут преобразованы в один и тот же формат.

Это не будет иметь никакого значения для компилятора (потому что конец строки считается простым пробелом), но это может иметь некоторое значение для других инструментов (например, 'diff' в вашей системе контроля версий).

ChrisW
источник
4

Это не просто Visual Studio ... Это были бы любые инструменты, которые читают файлы, компиляторы, компоновщики и т. Д., Которые могли бы справиться с этим.

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

Петр Y
источник
1
Я согласен. Лучше всего, чтобы ваша система SCM сделала это. Если вы используете svn, см. Также stackoverflow.com/questions/15687/…
kgriffs
Полностью согласен. Что произойдет, если я работаю над проектом и работаю под Windows, а мой напарник использует Mac. Мы будем постоянно менять CR на CRLF и обратно. Лучше всего позволить СКМ абстрагироваться от этого. Большинство ответов просто предполагают, что люди работают самостоятельно или все, кто работает над кодом, используют Windows.
bytedev
3

Когда вы копируете, вставляете что-то из Интернета, вы можете получить несовместимые окончания строк.
Чтобы это исправить, вы можете использовать расширение Visual Studio «Унификатор конца строки», которое может автоматически согласовать окончание строки при сохранении файла.

введите описание изображения здесь

Джей шах
источник
2

Там есть надстройка для Visual Studio 2008, которая преобразует формат конца строки при сохранении файла. Вы можете скачать его здесь: http://grebulon.com/software/stripem.php


источник
Это может помочь, когда вы получаете ошибку «несовместимые окончания строк» ​​из SVN.
кгрифы