我想将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来完成它?
答案 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
,然后输入