Есть :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 пониманием языка и сможет принять это во внимание при переиндентировании блока кода.