У меня есть скопированные из Интернета коды с отступом в два пробела, и я хочу заменить его на четырехсторонний. Интересно, есть ли короткая процедура vim для выполнения задачи без написания сценария vim? Вот как я сейчас делаю это с файлом HTML:
- Записать макрос
- Перейти в начало строки
- Визуально выделить все пробелы до первого появления символа «<»
- Удалите и вставьте все пробелы (в основном, чтобы удвоить их)
- Воспроизвести макрос до конца файла
Короче говоря qa0vt<yp<esc>jq
Подводные камни:
Макрос не работает для пустой строки или строки, которая не начинается с «<». И я понятия не имею, как распространить это решение на файл, отличный от HTML.
ts
: =tabstop
,sts
: =softtabstop
и[no]et
: =[no]expandtab
.retab
аргумент был бы полезен и почему мы не можем использовать его для этой задачи?:set sts=2 noet
и:retab! 2
поэтому он будет немного короче (хотя, возможно, менее читаемым).:set ts=2 sts=2 noet | retab! | set ts=4 sts=4 et | retab!
а затем используйте@:
в разных файлах, чтобы быстро применить одно и то же действие.Это возможно с помощью
:set shiftwidth=4
иgg=G
.источник
gg=G
значит точно? Я понимаю, что этоgg
означает «перейти на 1,1» иG
означает «перейти на последнюю строку».=
делает отступы, поэтому это просто означает отступ от начала до конца текста%retab
, который неправильно преобразовал пробелы, встроенные в строковые литералы.То, что я делаю, очень похоже на подходы esneider и cforbish, но набираю немного быстрее:
Просто заменяет начальный пробел (пробелы или табуляции) вдвое большим начальным пробелом (
&
заменяется совпадающим выражением).источник
%
.sed
и применить ко всем файлам в каталоге superuser.com/a/159286/41494Я использовал это регулярное выражение (оно удваивает количество ведущих пробелов):
источник
%s/\s\+/&&/
делает то же самое? Кстати, я думаю, чтоg
флаг не нужен (во-^pattern
%s/^\s\+/&&/g
ближе.Это очень старый вопрос, однако все ответы ... неверны ... У Vim есть очень простой способ изменить отступ всего файла. Я узнал об этом после написания собственной функции для этого, так что я нахожусь в той же лодке невежества;)
тип
это предполагает, что у вас есть табуляция, установленная на то, что вам нравится (поэтому для OP это будет ts = 4)
Я узнал об этом из http://vim.wikia.com/wiki/Fix_indentation , где упоминается
источник
Подобно (но несколько проще) ответу cforbish, это регулярное выражение будет дублировать ведущие пробелы
Или вы можете использовать это другое регулярное выражение для преобразования 2-х пространств в 4-пространства, сохраняя отдельные пространства (и нечетные количества в целом)
То есть,
источник
В дополнение к ответу @spro я поместил это в свой
.vimrc
Просто введите
:Format
.При визуальном выборе форматируются только выбранные строки.
Без визуального выделения форматируется весь файл.
источник
Это вариант ответов на основе регулярных выражений.
У меня есть сценарий bash в моем локальном каталоге bin, который удваивает количество пробелов в начале строки. Ввод может быть стандартный ввод или файл:
Я использую это в vim, визуально выбирая строку и вводя следующую команду:
Это избавляет меня от необходимости вводить (или запоминать) регулярное выражение.
Я также использую его в следующих картах:
который применит его к блоку недавно вставленного текста. Я обычно использую следующую карту для вставки, а не
:set paste
Мой обычный рабочий процесс:
или просто изменить отступ на извлеченных блоках, вставленных из другого буфера.
источник