Автоматически генерировать значения для #define, используя vi [m]

На данный момент у меня есть следующее в .h файл, который имеет следующее:

#define ONE
#define TWO
#define THREE
#define FOUR
..
.
#define FIFTY

С помощью vi[m]Как мы можем сгенерировать текст замены для макросов, который должен быть следующим:

#define ONE 1
#define TWO 2
#define THREE 3
#define FOUR 4
..
.
#define FIFTY 50

Постановка проблемы: Учитывая нижний предел (1), верхний предел (50) и шаг (то есть увеличение на 1, 2 или 3 и т. Д. За раз) — что такое vi команда для автоматического создания значений в вышеупомянутых макросах?

ОБНОВЛЕНИЕ: у меня нет возможности использовать enum,

4

Решение

Идите вперед и поставьте «1» после #define ONE (где это должно быть в конечном состоянии). Перейдите в начало этой строки (с курсором на #) и нажмите следующие клавиши (где C-a означает «ctrl + a»):

Q
Q # record macro q

3
вес
час
Y
$
J
$
п
С-а
^
Q # end macro q

4
8
@
Q # repeat macro 48x

Теперь объяснение:

  • QQ = запишите макрос с именем «q»
  • 3вес = сдвинуть три слова вправо
  • час = переместить один символ влево (через пробел перед числом)
  • Y$ = дергать до конца строки
  • J = двигаться вниз на одну строку
  • $ = идти до конца строки
  • п = вставить
  • С-а = увеличить число под курсором
  • ^ = перейти к началу строки
  • Q = остановить запись макроса
  • 48@Q = запустить макрос 48 раз

Дайте мне знать, если вы не поняли, или я неправильно понял. Он правильно работает на моем компьютере. Если вы хотите увеличивать больше, чем по одному за раз, просто поместите этот множитель перед C-a (например, 3C-a)

4

Другие решения

Line-select (C-V) все строки и тип

:r !awk '{print $0, NR}'
2

Прежде всего, я предполагаю, что все эти #define строки продолжаются, то есть между ними нет пустых строк или других строк, например этот случай не существует:

#define foo

#define bar
whatever
#define another

* Я добавил решение для этого случая в конце этого ответа *


Тогда могут быть две разные ситуации, первая проще, #define block сидит в начале вашего файла. что означает 1-й #define на 1-й линии.

в этом случае вы могли бы просто сделать

:%s/^#define.*/\=submatch(0)."  ".line(".")/g

который просто добавит номер строки в конце каждого #define заявление.

Другая ситуация, ваш #define statement block сидит где-то посередине файла.

Это решение является более общим, также работает для первого сценария.

Вы можете добавить отображение

:nnoremap <leader>do :let x=line(".")<cr>:%s/^#define.*/\=submatch(0)." ".(line(".")-x+1)/g<cr>

затем наведите курсор на 1й #define заявление, нажмите <leader>do, он сделает всю работу за вас. Таким образом, вам не нужно вручную вставлять «1», также не нужно записывать макрос.

это работает как:
введите описание изображения здесь

внешний cmd в vim (awk)

awk — это ядерное оружие обработки текста, использование awk в этом случае также хороший способ. он может обрабатывать эти отдельные операторы #define, например:
ваш файл выглядит так:

/*
comments
*/
#define ONE

//comment
#define TWO//empty lines
#define THREE

#define FOUR

если вы в VIM типа:

:%!awk '/^\#define/{$0= $0" "++x}1'

ваш файл превращается в:

/*
comments
*/
#define ONE  1

//comment
#define TWO 2//empty lines
#define THREE 3

#define FOUR 4
2
По вопросам рекламы [email protected]