Пробелы кажутся простыми, пока не встречаются табы, отступы, неразрывные пробелы и финальные окончания. Инструмент должен назвать символы, участвующие в равенстве. TextDiff всегда нормализует транспортные окончания, затем применяет ровно одно правило внутри строки. Показанное написание обеих версий не меняется. Так можно убрать известный шум, не делая вид, что игнорируемые символы исчезли из документов.
Три режима отвечают на разные вопросы
Точный режим сравнивает каждый символ и признак окончания. Режим краёв удаляет Unicode-пробелы только в начале и конце перед созданием ключа: отступ может совпасть, а внутренние интервалы остаются значимыми. Режим всех пробелов удаляет каждый пробельный фрагмент из ключа, поэтому `role: editor` и `role: editor` совпадают. Ни одна операция не переписывает показанный текст. Смена режима меняет аналитический вопрос, а не источники.
CRLF и LF здесь считаются транспортной разницей
Windows-копия может использовать CRLF, другая система — LF, а старый текст — одиночный CR. TextDiff преобразует все три разделителя в LF до токенизации, поэтому смена окончаний во всём репозитории не показывает каждую строку заменённой. Это правило продукта, а не точное сравнение байтов. Если тип окончания важен побайтно, нужен бинарный инструмент или система контроля версий. TextDiff сравнивает нормализованный обычный текст и не сохраняет исходный тип разделителя.
Финальный перевод строки — структура документа
После нормализации наличие финального LF остаётся признаком последней логической строки. Многие исходные форматы принято завершать переводом, а скопированные фрагменты часто не завершены. Скрытие признака заставляет сравнение расходиться с code review. Поэтому TextDiff считает состояния разными и ставит видимый маркер отсутствия перевода после незавершённой записи. Маркер является пояснением; скопированный вид не обещает быть применимым POSIX patch.