Не могу запустить скрипт с fzf из vim
У меня есть сценарий bash, который собирает некоторые данные, затем передает их через fzf, чтобы пользователь мог их выбрать, затем манипулирует выбором, а затем выводит его на стандартный вывод.
Это имитирует сценарий:
#!/bin/sh
echo hello | fzf | sed 's/h/j/g'
Это отлично работает из командной строки, но при запуске из vim для включения в текущий буфер TUI fzf никогда не отображается, и я получаю escape-последовательности ANSI, включенные в результат:
Неважно, как я запускаю команду из vim. я пытался:read !{cmd}
, :.!{cmd}
, и даже :let a=system('{cmd}')
.
Например, я ожидал, что это сработает:
:read !echo hello | fzf | sed 's/h/j/g'
Кажется, что fzf сбивает stdout с tty.
Я знаю, что это не ограничение vim, поскольку, если я заменю fzf другим интерактивным селектором с tty, он сработает.
Есть ли вариант fzf или vim, чтобы это работало?
1 ответ
Vim не так легко справляется с интерактивными командами. Как вы видели, fzf выводит много кода для управления дисплеем, аread
ожидает необработанного результата.
Вы можете сделать это с помощью execute
Вместо того, чтобы использовать read
прямо. Создав еще один ответ ( захватить вывод интерактивного сценария в 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()