#regex #vim #vim-macros
#регулярное выражение #vim #vim-макросы
Вопрос:
Я играл с 500 отдельными файлами, используя VIM, чтобы сделать одно из значений уникальным. Я не буду вставлять это, так как это полная ошибка 🙂
После создания одного элемента уникальным у меня есть один файл с 500 записями, разделенными пустой строкой.
Записал макрос, чтобы отметить строку 1, затем найдите пробел и отметьте предыдущую строку, затем запишите этот блок в файл с @b, увеличенным на 1.
Поскольку я не мог понять, как увеличить @a во время записи файла, я вставляю его, увеличиваю, а затем возвращаю обратно в @a .
"ap0:let @a="""^MAywdd
Все это работало нормально, за исключением того, что каждые 7 чисел команда increment пропускает три, поэтому вместо XML0001.xml чтобы XML0500.XML Я получаю XML001.xml чтобы XML0763.xml или что-то в этом роде.
Почему пропускается 3 числа при каждом 8-м вызове?
Мне просто любопытно, поскольку на данный момент, пока имена файлов уникальны, не имеет значения, какие они пронумерованы, но в конечном итоге мне нужно будет сделать так, чтобы выходные имена соответствовали значению @b должно быть.
РЕДАКТИРОВАТЬ Дикое предположение, что это как-то связано с потерей от 0 до 9 регистров?
Есть ли способ увеличить @a в режиме вставки что-то вроде
:'a,'b w XML"Increment @A".xml
Ответ №1:
Загадка приращения
Поскольку ваши числа имеют префикс с 0
, Vim считает их восьмеричными, поэтому приращение (с <C-a>
, я полагаю) переходит от 07
к 10
. Чтобы исправить это, вы можете удалить этот (сегодня довольно неясный) числовой формат:
:set nrformats-=octal
Прямое увеличение регистра
Если бы ваш регистр содержал только число, вы могли бы сделать:
:let @a = @a 1
(Примечание: =
не работает, поскольку регистр имеет строковый тип.)
Если ваш регистр содержит полное имя файла, вы должны использовать :help sub-replace-expression
, чтобы сопоставить первое число и увеличить его:
:let @a = substitute(@a, 'd ', '=submatch(0) 1', '')
Рекомендация плагина
Мой плагин EditSimilar предоставляет команду, которая ищет несуществующее смещение и записывает в него (части буфера):
:file XML0000.xml " Name the original buffer
:9999WritePlus " Writes XML0001.xml, XML0002.xml, etc.