使用vi [m]自动为#define生成值

时间:2013-02-01 06:06:33

标签: c++ c vim macros vi

截至目前,我在.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

3 个答案:

答案 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

现在解释:

  • q q =记录名为“q”的宏
  • 3 w =向右移动三个字
  • h =向左移动一个字符(在数字前的空格处)
  • y $ =拉到行尾
  • j =向下移动一行
  • $ =转到行尾
  • p =粘贴
  • C-a =增加光标下的数字
  • ^ =转到行的开头
  • q =停止录制宏
  • 4 8 @ q =运行宏48次

如果您不理解,或者我理解错误,请告诉我。它在我的电脑上正常工作。如果你想一次增加一个,只需将那个乘数放在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”,也不必记录宏。

它的工作方式如下: enter image description here

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