如何快速替换不同字符串的字符串模式?

时间:2016-04-16 14:41:58

标签: css vim

例如,我有很多HTML标签要设置样式,它们使用不同的类,并且具有不同的背景。背景图像文件具有与类名对应的名称。

我发现这样做的方法是猛拉:

.tab.home {
  background: ...home.jpg...
}

然后粘贴,然后:s/home/about

这要重复几次。我发现&可用于重复最后一个替换,但仅用于相同的目标字符串。用不同的目标字符串重复替换的最快方法是什么?

或者,可能有更有效的方法来做这样的事情?

2 个答案:

答案 0 :(得分:1)

我快速玩了一些vim宏魔法并提出了以下想法...我为这个长度道歉。我认为最好解释一下这些步骤..

首先,将要重复的文本块放入寄存器(我选择了寄存器z),所以将光标放在.tab行的开头我按"z3Y(选择reg z和yank 3行)。

然后我将我想要的一系列VIM命令输入缓冲区)"zp:.,%s/home/。 (只需按i并输入命令)

这转化为;

  • )转到当前“{}”区块的末尾,
  • "zp在注册z
  • 中粘贴文本的副本
  • .,%s/home/有两个技巧。

    1. .,%确保替换适用于从.tab开始到结束}结束的所有内容,以及
    2. 命令不完整(即最后没有),所以vim会提示我完成命令。

      • 请注意,虽然%s///会对文件的每一行执行替换,但重要的是要认识到%是范围1,$的别名。使用1,%作为范围,会导致%用作“跳转到匹配括号”运算符,从而产生从当前行到%匹配结束的范围。 (在本例中,是块中的右括号)

然后,在将光标放在行开头的)之后,我输入了"qy$,这意味着将所有字符拖到行尾,进入寄存器q。 这一点很重要,因为简单地用Y覆盖行将在寄存器中包含回车符,并且会导致宏失败。

然后我用@q执行了寄存器q的内容,并提示我在命令行上完成s/home/

在输入替换文本并按回车键后,粘贴的块(来自寄存器z)出现在已应用替换的缓冲区中。

此时,您可以通过简单输入@q重复上一次@@。您甚至不需要将光标向下移动到块的末尾,因为宏开头的)会为您执行此操作。

这有效地减少了对原始文本进行处理,插入原始文本以及将两个手动替换命令执行到简单@@中的过程。

完成后,您可以安全地从编辑缓冲区中删除宏字符串。

这是令人难以置信的vim-ish,可能会浪费一些时间来做正确的事,但是当你这样做时它可以为你节省更多。

Vim宏可能是你正在寻找的技巧。

答案 1 :(得分:0)

从手册中,我找到了:s//new-replacement。看起来打字太多了。

寻找更好的答案。