при увеличении регистра в n раз пропускаются значения

#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.