4

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

3 回答 3

4

继续并在#define ONE(它应该处于最终状态的位置)后面加上一个“1”。转到该行的开头(将光标放在 # 上)并按以下键(其中 Ca 表示“ctrl+a”):

q q # record macro q
3 w h y $ j $ p C-a ^ q # end macro q
4 8 @ q # repeat macro 48x

现在解释:

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

如果你不明白,或者我理解错了,请告诉我。它在我的电脑上正常工作。如果您想一次增加一个以上,只需将该乘数放在 Ca 前面(例如 3C-a)

于 2013-02-01T06:30:12.357 回答
2

行选择 ( C-V) 所有行并输入

:r !awk '{print $0, NR}'
于 2013-02-01T08:41:41.700 回答
2

首先,我假设所有这些#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
于 2013-02-01T10:17:45.583 回答