截至目前,我在.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
。
答案 0 :(得分:4)
继续在#define ONE
之后放置一个“1”(它应该处于最终状态)。转到该行的开头(将光标移到#上)并按下以下键(其中C-a表示“ctrl + a”):
q q
# record macro q
3 瓦特 ħ ý $ Ĵ $ P C-一个 ^ q# end macro q
4 8 @ q# repeat macro 48x
现在解释:
如果您不理解,或者我理解错误,请告诉我。它在我的电脑上正常工作。如果你想一次增加一个,只需将那个乘数放在C-a前面(例如3C-a)
答案 1 :(得分:2)
行选择(C-V
)所有行和类型
:r !awk '{print $0, NR}'
答案 2 :(得分:2)
首先,我假设所有这些#define
行都是连续的,也就是说,它们之间没有空行或其他行,例如:这种情况不存在:
#define foo
#define bar
whatever
#define another
*我在本回答结尾处为此案例添加了一个解决方案*
然后可能有两种不同的情况,第一种更简单,#define block
位于文件的开头。这意味着第一行#define
。{/ p>
在这种情况下你可以做到
:%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