3

我有一个 bash 脚本,它组装一些数据,然后通过 fzf 管道供用户选择,然后操纵选择,然后将其打印到标准输出。

这模拟了脚本:

#!/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 似乎混淆了 tty 的标准输出。

我知道这不是 vim 的限制,因为如果我用 fzf 替换另一个带有 tty 的交互式选择器,它就可以工作。

是否有 fzf 或 vim 选项可以完成这项工作?

4

1 回答 1

1

Vim 不能那么容易地处理交互式命令。如您所见,fzf 输出大量代码来操作显示,并且read期望得到原始结果。

您可以使用execute而不是read直接使用来执行此操作。建立另一个答案(在 vim 中捕获交互式脚本的输出)但将事情更改为使用 fzf,我修改了@joshtch 的解决方案以使用任意脚本,并检查它是否适用于 fzf:

我的-fzf-script.sh:

#!/bin/sh
ls | fzf

和 vim 方面:

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()
于 2019-10-29T09:42:23.207 回答