Как я могу реорганизовать существующий файл исходного кода, чтобы нормализовать все использование вкладок? - PullRequest
1 голос
/ 16 марта 2020

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

Есть ли какой-либо инструмент, который пытается проанализировать файл и «нормализовать» это, то есть преобразовать все вхождения четырех пробелов в обычную табуляцию или все вхождения табуляции в четыре пробела, чтобы сохранить его согласованность?

Я предполагаю, что нечто подобное можно сделать даже с помощью простой однострочной строки vim?

1 Ответ

1 голос
/ 16 марта 2020

Есть :retab и :retab!, которые могут помочь, но есть предостережения.

Проще, если вы используете пробелы для отступа, тогда просто установите 'expandtab' и выполните :retab, тогда все ваши вкладки будут преобразованы в пробелы на соответствующих остановках вкладок (по умолчанию - 8.) Это просто, и в этом методе нет ловушек!

Если Вы хотите использовать 4 пробела, затем оставьте включенным 'expandtab' и установите 'softtabstop' на 4. (Не изменяйте параметр 'tabstop', он всегда должен оставаться на 8.)

Если вы хотите сделать обратное и преобразовать во вкладки, вместо этого вы могли бы установить 'noexpandtab', а затем использовать :retab! (который также рассмотрит последовательности пробелов и попытается преобразовать их обратно во вкладки. Основная проблема этого подхода заключается в том, что он не только учитывает отступы для преобразования, но и последовательности пробелов в середине строк, что может привести к тому, что операция повлияет на строки внутри вашего кода, что было бы крайне нежелательно.

Возможно лучший подход для замены пробелов на табуляцию для отступа заключается в использовании следующей команды замены:

:%s#^\s\+#\=repeat("\t", indent('.') / &tabstop).repeat(" ", indent('.') % &tabstop)#

Да, это глоток ... Это совпадает с пробелами в начале строк, затем с помощью indent() функция для определения общего отступа (эта функция рассчитывает отступ с учетом табуляции), а затем делит ее на 'tabstop', чтобы определить, сколько вкладок и сколько пробелов требуется для конкретной строки c.

Если эта команда работает для вас, вы можете подумать о добавлении сопоставления или :command для его удобства. Например:

command! -range=% Retab <line1>,<line2>s#^\s\+#\=repeat("\t", indent('.') / &tabstop).repeat(" ", indent('.') % &tabstop)

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

Наконец, последняя альтернатива :retab заключается в том, чтобы попросить Vim полностью «переформатировать» ваш код, используя команду =, которая будет использовать текущие 'indentexpr' или другие конфигурации отступов, такие как 'cindent', для полного повторного отступа блока. Как правило, это учитывает ваши параметры 'noexpandtab' и 'smarttabstop', поэтому он использует вкладки и пробелы для отступов. Недостатком этого подхода является то, что он полностью переформатирует ваш код, включая изменение отступов в некоторых местах. Плюс в том, что он, как правило, обладает семантическим c пониманием языка и сможет принять это во внимание при переиндентировании блока кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...