Найти в Дзене
Блокнот математика

Рубрика "Секреты Вим". Числа в тексте: инкремент и декремент.

Всем привет, с вами еженедельная рубрика "Секреты Вим". Вим хорош тем, что он умный: он знает кое-что о тексте, с которым вы работаете. Он знает про слова, предложения, абзацы, блоки кода, функции и ключевые слова. Число в тексте также может быть распознано как таковое, и его можно увеличить или уменьшить: для этого есть несколько удобных команд, о которых я сегодня и расскажу.
Чисел в тексте

Всем привет, с вами еженедельная рубрика "Секреты Вим". Вим хорош тем, что он умный: он знает кое-что о тексте, с которым вы работаете. Он знает про слова, предложения, абзацы, блоки кода, функции и ключевые слова. Число в тексте также может быть распознано как таковое, и его можно увеличить или уменьшить: для этого есть несколько удобных команд, о которых я сегодня и расскажу.

Чисел в тексте может быть много!
Чисел в тексте может быть много!

Цифры в тексте — это число, и вполне может быть, что нужно его изменить. Например, номер версии функции: была 6.42, а надо 6.43. Вим умеет понимать целые числа в тексте. Команды, ctrl+A увеличит число на единицу (с учетом знака), а ctrl+X — уменьшит. Если предварительно указать повторитель, то прибавится-отнимется он: 42<C-A>.

Неожиданно обратное действие этих команд на второе число в диапазоне (например, страниц): 42--666. Формально перед ним минус, так что оно отрицательное...

Числа могут быть не только десятичные, но шестнадцатеричные, восьмеричные, двоичные и алфавитные однобуквенные (A+1=B, A-1=A, Z-1=Y, Z+1=Z).

Можно применить команду к выделенному тексту — она применится к первому числу. То же верно, если под курсором нет подходящего числа: отыщется первое ближайшее справа от курсора.

Очень полезная команда g<C-A>. Она применяется к выделению

(выделять можно мышкой, если она включена, а также командой v и стрелками — интервал, V — выделения целыми строками, <C-V> — выделение прямоугольника)

и увеличивает число на каждой строке на один шаг больше. Например, создадим список:

1. ---
1. ---
1. ---
1. ---
1. ---

Выделим его, начиная со второй строки (V3j), и нажмем g, потом <C-A>. Получим

1. ---
2. ---
3. ---
4. ---
5. ---

А если нажмем 2g<C-A>, то увидим

1. ---
3. ---
5. ---
7. ---
9. ---

Симметрично работает <C-X>. Для десятичных чисел уходит в минус. Для восьмеричных попытка уменьшить нуль приводит к 01777777777777777777777 — ну, вы поняли. Сдвиг, самое большое число. Если его увеличить, будет нуль. Для шестнадцатеричных — аналогично, самое большое 0xffffffffffffffff.

Для десятичных предел тоже есть, но не знаю, какой. Число 9999999999999999999 инкрементируется нормально, а на одну девятку больше — уже неправильно((( Вообще, это баг, и я о нем сообщу.

Для букв (латинских) A не уменьшается, Z не увеличивается, регистр может быть любым и сохраняется.

Аналогично, минус считается для десятичных чисел только. Дроби не считаются: число до точки и после нее — просто два разных числа. Чисто целочисленная фишка!

Какие числа считать, а какие нет, определяет опция nrformats. Задается она как любая опция: set nrformats=... Вместо многоточия может ничего не быть (только десятичные), или могут стоять, через запятую, bin, octal, hex, alpha — в любом сочетании.

Просто set nrformats позволяет посмотреть, что там сейчас. Десятичные числа всегда в игре; остальное подключается через запятую.

Варианты:

  • bin — числа, начинающиеся с 0b или 0B, считаются двоичными, и инкрементируются соответственно, если они подходят по формату — не содержат ничего, кроме нулей и единиц.
  • octal — числа восьмеричные; начинаются с нуля и не содержат цифр 8 и 9. Осторожно: если вы не отключили octal, число 007 при инкременте превратится в 010. Обычно Вим старается сохранять длину числа, оставляя и добавляя ведущие нули (если они есть: 0010 - 1 = 0009 при отключенных восьмеричных, но 10 - 1 = 9). Однако если возможен конфуз, нули будут удалены. Например, число 0008 десятичное, а не восьмеричное; но декремент приведет к 0007, которое будет воспринято как восьмеричное (если они подключены), так что получится просто 7.
  • hex — шестнадцатеричные числа. Начинаются с 0x или 0X. Самая правая буква определяет регистр: так, число 0xabF станет при инкременте 0xAC0, а 0x420 при декременте — 0x41f.
  • alpha — инкремент латинских (точнее, английских) букв в алфавитном порядке. Регистр сохраняется: v+1=w, W-1=V.

Отмечу, что эти команды удобны сами по себе, но особенно хороши в макросах.

Еще отмечу, что эту фишку не так легко найти в справке. Ищите по слову nrformats!

Удачи, коллеги.

Оглавление рубрики

Путеводитель по каналу