我有一个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转义序列:
我从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选项进行这项工作?
答案 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()