我想在vim中执行以下操作。
a,2
替换为a@,a@
b,3
替换为b@,b@,b@
c,6
替换为c@,c@,c@,c@,c@,c@
等等。答案 0 :(得分:7)
这是强大的:help sub-replace-expression
:
:%s/\(\w\),\(\d\+\)/\=join(repeat([submatch(1) . '@'], submatch(2)), ',')/g
匹配字字符(\w
)后跟,
和一个数字,将@
附加到每个匹配的字符(submatch(1) . '@
),将其转换为列表([...]
),将List元素与匹配的数字(repeat()
)相乘,然后将join()
s重新转换为,
- 分隔的字符串,用作替换字符。
这是基于你的例子;你需要根据你的特殊需要调整模式。
答案 1 :(得分:2)
vim具有repeat()
功能。这个命令应该做你想要的:
%s/\v([a-z]),(\d+)/\=substitute(repeat(submatch(1).'@,',submatch(2)),',$','','g')/g
请注意,此行会将foo,3abc
更改为foo@,o@,o@abc
。结果可能不是您正在寻找的,但通过阅读命令,您应该知道这个想法,您可以更改它以使其符合您的需求。
答案 2 :(得分:1)
你可以使用 https://github.com/msanders/snipmate.vim 像SublimeText编辑器的片段
实施例
snippet doctype XHTML 1.0 Transitional
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
如果您输入
doctype XHTML 1.0 Transitional
并按[TAB] - 你自动填写文字
你可以使用像这样的参数snippet proto
${1:class_name}.prototype.${2:method_name} =
function(${3:first_argument}) {
${4:// body...}
};
: - )