我正在尝试编写一个函数,该函数将删除与模式匹配的每一行。但是这种模式将根据列表中的单词(由字典制成)而改变。我以为这是一个简单的for循环,但是for循环变量不会在模式内扩展。 ^The key^The red等。它不会将^The green变量扩展到它所持有的任何值。还是有一种更好的方法可以完全实现我的目标?

#1 楼

您需要使用:execute来“构建”全局命令,如下所示:

for key in sort(keys(myDict))
    execute '%g/^The ' . key . '/d'
endfor


有关使用:h :exe的更多帮助,请参见:execute


您可能需要转义键
可能考虑轮换。例如\(red\|blue\|green\)

您可能希望将:delete放入黑洞寄存器中,以防止出现任何意外情况。例如:d_



评论


完善。这个问题不需要在变量内部转义,但是,为了完整起见,该怎么做?只需在该变量上使用split并将其连接回一个新的变量中,并在需要的地方加上转义字符?

–embedded.kyle
15年3月16日在22:05

最简单的方法是将\ V或非常不可思议的方法与escape()函数一起使用。例如let regex ='\ V \ ^ The \('。join(map(keys(myDict),'escape(v:val,'''\''')'),'\ |')。'\)'

– Peter Rincker
15年3月16日在23:11