2

我想从文件路径中提取信息并将其用作替代字符串的一部分,绞尽脑汁,尝试了很多次,结果发现了以下作品

let spd = split(expand('%:p'),"/")
%s/to_be_replaced/\=spd[-2]/g

我想将两个命令合并为一个

%s/to_be_replaced/\=split(expand('%:p',"/"))[-2]/g

但它不起作用。由于我在选项卡模式下处理多个文件,因此两个命令方法实际上非常不方便。此外,它不满足要求,因为

%s/to_be_replaced/some_string\=spd[-2]more_string/g

也是错误的。所以我想知道是否有解决方案或更快的方法来做到这一点?

4

2 回答 2

3

尝试其他分隔符(例如@

%s@to_be_replaced@\=split(expand('%:p'),'/')[-2]@g

如果要嵌入 expr 内幕字符串:

%s@to_be_replaced@\=printf('some_string%smore_string', spd[-2])@g
于 2013-10-15T03:14:57.203 回答
0

选择

除非您为多个缓冲区(:bufdo等)调用此方法,否则您的表达式对于缓冲区来说是常量。因此,您可以通过以下方式将其逐字插入命令行<C-r>=

:%s/to_be_replaced/<C-r>=split(expand('%:p'),"/")[-2]<CR>/g

你的问题的解释

您最初的尝试不起作用的原因在以下位置进行了解释:help sub-replace-expression

注意:分隔符不能出现在表达式中!考虑使用像“@”或“:”这样的字符。

正如kev 所指出的,您可以只使用任何其他单字节字符,但不能使用字母数字字符、'\'、'"' 或'|'。

于 2013-10-15T08:11:19.820 回答