На данный момент у меня есть следующее в .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
,
Идите вперед и поставьте «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
Теперь объяснение:
Дайте мне знать, если вы не поняли, или я неправильно понял. Он правильно работает на моем компьютере. Если вы хотите увеличивать больше, чем по одному за раз, просто поместите этот множитель перед C-a (например, 3C-a)
Line-select (C-V
) все строки и тип
:r !awk '{print $0, NR}'
Прежде всего, я предполагаю, что все эти #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