如何使用Vim将每个匹配保存在不同的文件中

时间:2010-10-11 16:09:13

标签: vim

我想将g/pattern1/,/pattern2/的输出保存到文件中(对于每个匹配,不同的文件)。

e.g。

def
.......
end

def
.......
end

你最终会找到每个“def ... end”的文件。

尝试使用tempname(),如下所示:

g/pattern1/,/pattern2/exe 'w ' . tempname()但失败且exe

不允许范围

也尝试了

g/pattern1/,/pattern2/w `tempname()`

获得了tempname()的评估,但是由于“文件名太多”错误而失败。

我错过了什么?可以通过使用全局和其他命令来完成,还是需要vimscript来完成它?

2 个答案:

答案 0 :(得分:1)

g/pattern1/,/pattern2/execute "w ".fnameescape(tempname())<CR>

如果要将变量插入命令行(如果它是映射),请使用execute。如果不是,请尝试使用

g/pattern1/,/pattern2/w <C-r>=fn<Tab>e<Tab>te<Tab>)<CR><CR>

fn<Tab> wildmode=longest,list:full fname将扩展为fnamee<Tab>fnameescape(将扩展为te<Tab>tempname()将扩展为<C-r>=fnameescape(tempname())<CR> },这是输入fnameescape的简短方法。如果您确定tempname不会返回带有特殊字符的文件名,则可以省略`tempname()`

请注意,反引号不会执行vimscript函数,它们会执行shell命令,因此tempname()会尝试在shell中调用`=tempname()`并使用此调用的结果替换filename。根据帮助,您应该写{{1}}。

答案 1 :(得分:0)

尝试使用:g/pattern1/normal! :.,/pattern2/w `tempname()`^M作为CTRL-V输入^M,然后输入