Не могу запустить скрипт с 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()
Другие вопросы по тегам