Я хотел бы определить ширину табуляции, используемую в исходных файлах с отступом.Это не сложно для файлов с особенно регулярным отступом, где начальные пробелы используются только для отступа, всегда в кратных ширине табуляции, а отступы увеличиваются на один уровень за раз.Но многие файлы будут иметь некоторые отклонения от такого рода регулярных отступов, как правило, для некоторой формы вертикального выравнивания.Поэтому я ищу хорошую эвристику, чтобы оценить, какая ширина вкладки была использована, что дает некоторую возможность для неправильного отступа.
Мотивация для этого - написать расширение для редактора SubEthaEdit.К сожалению, SubEthaEdit не делает ширину вкладки доступной для сценариев, поэтому я собираюсь угадать ее на основе текста.
Подходящая эвристика должна:
- Работать достаточно хорошо для интерактивного использования.Я не думаю, что это будет проблемой, и только часть текста может быть использована в случае необходимости.
- Быть независимым от языка.
- Возвращает самую длинную подходящую ширину вкладки.Например, любой файл с шириной табуляции в четыре пробела также может быть файлом с табуляцией в два пробела, если каждый отступ на самом деле вдвое больше уровней.Ясно, что четыре пробела были бы правильным выбором.
- Всегда делайте все правильно, если отступы полностью правильные.
Некоторые упрощающие факторы:
- Можно предположить, что отступ по крайней мере для одной строки.
- Можно предположить, что ширина вкладки равна по крайней мере двумпространства.
- Можно предположить, что отступ выполняется только с пробелами.Дело не в том, что я имею что-то против вкладок - наоборот, сначала я проверю, есть ли вкладки для отступов, и обработаю их отдельно.Это означает, что вкладки и пробелы смешивания отступов могут обрабатываться неправильно, но я не считаю это важным.
- Можно предположить, что нет строк, содержащих только пробелы.
- Не все языки должны обрабатываться правильно.Например, успех или неудача с такими языками, как lisp и go, были бы совершенно не важны, поскольку они обычно не имеют отступов вручную.
- Совершенство не требуется.Мир не закончится, если несколько строк иногда придется настраивать вручную.
Какой подход вы бы выбрали, и в чем вы видите его преимущества и недостатки?
Если вы хотите предоставить рабочий код в своем ответе, лучшим подходом, вероятно, является использованиесценарий оболочки, который читает исходный файл из stdin
и записывает ширину вкладки в stdout
.Псевдокод или четкое описание на словах тоже подойдет.
Некоторые результаты
Чтобы протестировать разные стратегии, мы можем применять разные стратегии к файлам в стандартных библиотеках для языковых дистрибутивов, так как они предположительно следуют стандартному отступу для языка,Я рассмотрю библиотеки Python 2.7 и Ruby 1.8 (системная среда устанавливается на Mac OS X 10.7), которые ожидают ширину вкладок 4 и 2 соответственно.Исключаются те файлы, у которых есть строки, начинающиеся с символов табуляции или у которых нет строк, начинающихся как минимум с двух пробелов.
Python:
Right None Wrong
Mode: 2523 1 102
First: 2169 1 456
No-long (12): 2529 9 88
No-long (8): 2535 16 75
LR (changes): 2509 1 116
LR (indent): 1533 1 1092
Doublecheck (10): 2480 15 130
Doublecheck (20): 2509 15 101
Ruby:
Right None Wrong
Mode: 594 29 51
First: 578 0 54
No-long (12): 595 29 50
No-long (8): 597 29 48
LR (changes): 585 0 47
LR (indent): 496 0 136
Doublecheck (10): 610 0 22
Doublecheck (20): 609 0 23
В этих таблицах «Право» следует принимать как определение ширины языковой стандартной закладки, «Неверно» - ненулевую ширину вкладки, не равную стандартной языковой ширине, и «Нет» - нулевую вкладку. ширина или нет ответа. «Режим» - это стратегия выбора наиболее часто встречающегося изменения отступа; «First» принимает отступ первой строки с отступом; «No-long» - это стратегия FastAl по исключению строк с большим отступом и переходу в режим, где число указывает максимально допустимое изменение отступа; «LR» - это стратегия Patrick87, основанная на линейной регрессии, с вариантами, основанными на изменении отступа между строками и абсолютном отступе строк; «Двойная проверка» (не смог противостоять каламбуру!) - это модификация Марка стратегии FastAl, ограничивающая возможную ширину вкладки и проверяющая, часто ли встречается половина модального значения, с двумя различными порогами для выбора меньшей ширины.