首先,我假设所有这些#define
行都是连续的,也就是说,中间没有空行或其他行,例如这种情况不存在:
#define foo
#define bar
whatever
#define another
*我在这个答案的末尾添加了一个解决方案*
那么可能有两种不同的情况,第一种更简单,#define block
位于文件的开头。这意味着第一#define
行的第一名。
在这种情况下,你可以这样做
:%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>
然后将光标移动到第一条#define
语句,按<leader>do
,它将为您完成工作。这样,您就不必手动插入“1”,也不必录制宏。
它的工作原理如下:
vim 中的外部 cmd (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