无法使用vim中的fzf运行脚本

时间:2019-10-17 21:42:49

标签: vim fzf vim-fzf

我有一个bash脚本,该脚本会组合一些数据,然后将其通过fzf传递给用户选择,然后操纵选择,然后将其打印到stdout。

这模拟了脚本:

function calculateRowColAndIndices() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName("ReportGenerator");
  var hA=sh.getRange(1,1,1,sh.getLastColumn()).getValues()[0];
  var hObj={};
  hA.forEach(function(name,i){
    hObj[name]=i;
  });
  var rg=sh.getRange(2,1,sh.getLastRow()-1,sh.getLastColumn());
  var vA=rg.getValues();
  vA.forEach(function(r,i){
    r[hObj.col]=sh.getRange(r[hObj.A1Not]).getColumn();
    r[hObj.row]=sh.getRange(r[hObj.A1Not]).getRow();
    r[hObj.cidx]=Number(r[hObj.col])-1;
    r[hObj.ridx]=Number(r[hObj.row])-1;
  })
  rg.setValues(vA);
}

这在命令行上很好用,但是当从vim运行它以包括在当前缓冲区中时,fzf TUI从不显示,并且我得到了包含在结果中的ANSI转义序列:

enter image description here

我从vim运行命令没关系。我已经尝试过#!/bin/sh echo hello | fzf | sed 's/h/j/g' :read !{cmd},甚至:.!{cmd}

例如,我希望它能起作用:

:let a=system('{cmd}')

fzf似乎使tty的stdout混乱。

我知道这不是vim的局限性,因为如果我用tty替换fzf来代替另一个交互式选择器,它将起作用。

是否可以使用fzf或vim选项进行这项工作?

1 个答案:

答案 0 :(得分:1)

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

和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()