我有一个bash脚本,它组装一些数据,然后通过fzf传输给用户进行选择,然后操作选择,然后将其打印到stdout。
这将模拟脚本:
#!/bin/sh
echo hello | fzf | sed 's/h/j/g'这在命令行中工作得很好,但是当从vim运行它以包含在当前缓冲区中时,fzf TUI永远不会显示,并且我在结果中包含ANSI转义序列:

我如何从vim运行该命令并不重要。我尝试过:read !{cmd},:.!{cmd},甚至:let a=system('{cmd}')。
例如,我希望这是可行的:
:read !echo hello | fzf | sed 's/h/j/g'fzf似乎将stdout混淆为tty。
我知道这不是vim的限制,因为如果我用tty替换fzf的另一个交互式选择器,它就能工作。
有没有fzf或vim选项可以让它工作?
发布于 2019-10-29 17:42:23
Vim不是那么容易处理交互式命令的。正如您所看到的,fzf输出了大量代码来操作显示,而read期望得到一个原始结果。
您可以使用execute来完成此操作,而不是直接使用read。基于另一个答案( Capture the output of an interactive script in vim ),但为了使用fzf,我修改了@joshtch的解决方案以使用任意脚本,并检查了它是否使用fzf:
my-fzf-script.sh:
#!/bin/sh
ls | fzf而事情的另一面是:
function! <SID>InteractiveFZFCommand()
let tempfile=tempname()
execute '!./my-fzf-script.sh >' . shellescape(tempfile)
try
silent execute 'read' tempfile
finally
call delete(tempfile)
endtry
endfunction
command! -nargs=0 InteractiveFZFCommand call <SID>InteractiveFZFCommand()https://stackoverflow.com/questions/58441086
复制相似问题