在Vim中使用递增值搜索和替换

Fre*_*III 26 vim replace

可以说我写了一个简单的CSS规则:

.star_10 {
  background: url(stars.png) no-repeat 0 0;
}
Run Code Online (Sandbox Code Playgroud)

我需要10个,所以我复制了9次.

.star_10 {
  background: url(stars.png) no-repeat 0 0;
}
.star_10 {
  background: url(stars.png) no-repeat 0 0;
}
.star_10 {
  background: url(stars.png) no-repeat 0 0;
}
.star_10 {
  background: url(stars.png) no-repeat 0 0;
}
.star_10 {
  background: url(stars.png) no-repeat 0 0;
}
Run Code Online (Sandbox Code Playgroud)

等等

现在我想用增量值更改star_100 0,所以它看起来像这样:

.star_10 {
  background: url(stars.png) no-repeat 0 0;
}
.star_9 {
  background: url(stars.png) no-repeat 0 -18px;
}
.star_8 {
  background: url(stars.png) no-repeat 0 -36px;
}
.star_7 {
  background: url(stars.png) no-repeat 0 -54px;
}
Run Code Online (Sandbox Code Playgroud)

等等...

那么如何搜索/替换每个实例,进行计算并编写呢?

Her*_*ral 58

您可以使用宏轻松完成.让我们说你只有这个:

.star_10 {
  background: url(stars.png) no-repeat 0 0;
}
Run Code Online (Sandbox Code Playgroud)

将光标放在第一个点(in .star10)上,然后在正常模式下键入以下内容:

qa3yy3jp^Xjt;18^Xk0q
Run Code Online (Sandbox Code Playgroud)

解释:

  1. qa 将在寄存器"a"中开始宏录制.
  2. 3yy 将猛拉(复制)以下3行.
  3. 3j 将光标放下3行.
  4. p 将粘贴过去的文本.
  5. ^X (ctrl + x)将减少星级编号.
  6. j 将光标放下一行.
  7. t;将光标;放在当前行中的下一个光标之前.
  8. 18^X 将背景的y坐标减少18;
  9. k 将光标放一行,
  10. 0 将光标放在行的开始处.
  11. q 将完成宏录制.

在那之后,你可能会有这样的事情.

.star_10 {
  background: url(stars.png) no-repeat 0 0;
}

.star_9 {
  background: url(stars.png) no-repeat 0 -18;
}
Run Code Online (Sandbox Code Playgroud)

而已.只需将光标放在.star_9上的点上,然后按下8@a再次执行寄存器中记录的宏a 八次.

  • 虽然很多人都在谈论功能,插件等,但宏是vim的真正力量. (12认同)
  • 另一个很好的例子,说明为什么Vim用最先进的IDE来擦拭地板 (7认同)

Ren*_*ger 13

您可以将s/pattern/replace构造与\=符号一起使用以评估函数或表达式,如下所示:

减少.star_10:

let g:decr = 11

fu! Decr() 
  let g:decr = g:decr - 1
  return g:decr
endfu

:%s/.star_10/\=".star_" . Decr()/
Run Code Online (Sandbox Code Playgroud)

同样,你也可以

let g:decr_18 = 18
fu! Decr18() 
  let g:decr_18 = g:decr_18 - 18
  return g:decr_18
endfu
Run Code Online (Sandbox Code Playgroud)

然后0 0;用a 替换

:%s/no-repeat 0 0;/\="no-repeat 0 " . Decr18() . "px"/
Run Code Online (Sandbox Code Playgroud)

对于这两个函数,声明了一个(全局)变量,该变量在函数内被操作并返回.对于与模式匹配的每一行,都会调用功能区本身.模式被替换为后面的表达式\=.