Подтвердить что ты не робот

Измените 2-пространственный отступ на 4-пространство в vim

У меня есть коды, скопированные из Интернета, которые имеют отступы с 2-мя пробелами, и я хочу изменить его на 4-пространственный отступ. Интересно, существует ли короткая процедура vim для выполнения задачи без необходимости писать vim script? Вот как я сейчас делаю это с HTML файлом:

  • Записать макрос
  • Перейти к началу строки
  • Визуально выберите все пробелы до первого появления "<"
  • Янь и вставьте все пробелы (в основном, чтобы удвоить их)
  • Повторное воспроизведение макроса до конца файла

Короче qa0vt<yp<esc>jq

Ловушки:

Макрос не работает для пустой строки или строки, которая не начинается с "<". И я не знаю, как расширить это решение до не-HTML файла.

4b9b3361

Ответ 1

Общий способ изменения отступа заключается в изменении табуляции:

Вставьте свой файл в пустой буфер, затем:

:set ts=2 sts=2 noet
:retab!

Это изменяет каждые 2 пробела на символ TAB, а затем:

:set ts=4 sts=4 et
:retab

Это изменяет каждую TAB на 4 пробела.

Преимущество этого метода заключается в том, что вы также можете использовать его другим способом, например, для преобразования из 4 в 2 пространства.

Ответ 2

Это возможно с помощью :set shiftwidth=4 и gg=G.

Ответ 3

То, что я делаю, очень похоже на подходы esneider и cforbish, но немного быстрее набирать:

:%s/^\s*/&&

Просто заменяет ведущее пространство (пробелы или вкладки) вдвое большим количеством ведущих (& заменяется совпадающим выражением).

Ответ 4

Я использовал это регулярное выражение (он удваивает число ведущих пробелов):

%s;^\(\s\+\);\=repeat(' ', len(submatch(0))*2);g

Ответ 5

Аналогичный (но несколько более простой) для ответа cforbish, это регулярное выражение будет дублировать ведущие пробелы

:%s/^\( \+\)/\1\1

Или вы можете использовать это другое регулярное выражение для преобразования 2-пространств в 4-пространства, сохраняя одиночные пробелы (и нечетные суммы вообще)

:%s/^\(\(  \)\+\)/\1\1

То есть

  • 1 пробел ⇢ 1 пробел
  • 2 пробела ⇢ 4 пробела
  • 3 пробела ⇢ 5 пробелов
  • 4 пробела ⇢ 8 пробелов

Ответ 6

Это очень старый вопрос, однако все ответы... неправильные... У Vim есть очень простой способ перекрыть весь файл. Я узнал об этом после того, как написал свою собственную функцию, чтобы сделать это, поэтому я нахожусь в той же ловушке невежества;)

type

gg=G

это предполагает, что у вас есть табуляция, которая вам нравится (так что для OP это будет ts = 4)

Я узнал об этом из http://vim.wikia.com/wiki/Fix_indentation, в котором упоминается

В нормальном режиме, набрав gg = G, будет повторно указываться весь файл. Это особый случай; = - оператор. Точно так же, как d или y, он будет действовать на любой текст, который вы переместите с помощью команды перемещения курсора. В этом случае gg позиционирует курсор в первой строке, затем = G отступов от текущей позиции курсора до конца буфера.