例如,我有很多HTML标签要设置样式,它们使用不同的类,并且具有不同的背景。背景图像文件具有与类名对应的名称。
我发现这样做的方法是猛拉:
.tab.home {
background: ...home.jpg...
}
然后粘贴,然后:s/home/about
。
这要重复几次。我发现&
可用于重复最后一个替换,但仅用于相同的目标字符串。用不同的目标字符串重复替换的最快方法是什么?
或者,可能有更有效的方法来做这样的事情?
答案 0 :(得分:1)
我快速玩了一些vim宏魔法并提出了以下想法...我为这个长度道歉。我认为最好解释一下这些步骤..
首先,将要重复的文本块放入寄存器(我选择了寄存器z
),所以将光标放在.tab
行的开头我按"z3Y
(选择reg z和yank 3行)。
然后我将我想要的一系列VIM命令输入缓冲区)"zp:.,%s/home/
。 (只需按i
并输入命令)
这转化为;
)
转到当前“{}”区块的末尾,"zp
在注册z
, .,%s/home/
有两个技巧。
.,%
确保替换适用于从.tab
开始到结束}
结束的所有内容,以及命令不完整(即最后没有),所以vim会提示我完成命令。
%s///
会对文件的每一行执行替换,但重要的是要认识到%
是范围1,$
的别名。使用1,%
作为范围,会导致%
用作“跳转到匹配括号”运算符,从而产生从当前行到%
匹配结束的范围。 (在本例中,是块中的右括号)然后,在将光标放在行开头的)
之后,我输入了"qy$
,这意味着将所有字符拖到行尾,进入寄存器q。
这一点很重要,因为简单地用Y
覆盖行将在寄存器中包含回车符,并且会导致宏失败。
然后我用@q
执行了寄存器q的内容,并提示我在命令行上完成s/home/
。
在输入替换文本并按回车键后,粘贴的块(来自寄存器z)出现在已应用替换的缓冲区中。
此时,您可以通过简单输入@q
重复上一次@@
。您甚至不需要将光标向下移动到块的末尾,因为宏开头的)
会为您执行此操作。
这有效地减少了对原始文本进行处理,插入原始文本以及将两个手动替换命令执行到简单@@
中的过程。
完成后,您可以安全地从编辑缓冲区中删除宏字符串。
这是令人难以置信的vim-ish,可能会浪费一些时间来做正确的事,但是当你这样做时它可以为你节省更多。
Vim宏可能是你正在寻找的技巧。
答案 1 :(得分:0)
从手册中,我找到了:s//new-replacement
。看起来打字太多了。
寻找更好的答案。