Не могу запустить скрипт с fzf из vim - PullRequest
3 голосов
/ 18 октября 2019

У меня есть скрипт bash, который собирает некоторые данные, затем передает их через fzf для выбора пользователем, затем манипулирует выбором, а затем печатает его в стандартный вывод.

Это моделирует скрипт:

#!/bin/sh
echo hello | fzf | sed 's/h/j/g'

Это прекрасно работает из командной строки, но при запуске его из vim для включения в текущий буфер, пользовательский интерфейс fzf никогда не отображается, и я получаю escape-последовательности ANSI, включенные в результат:

enter image description here

Не имеет значения, как я запускаю команду из vim. Я пробовал :read !{cmd}, :.!{cmd} и даже :let a=system('{cmd}').

Например, я ожидал, что это сработает:

:read !echo hello | fzf | sed 's/h/j/g'

fzf, кажется, вводит в заблуждение стандартный вывод дляtty.

Я знаю, что это не ограничение vim, поскольку, если я заменю fzf на другой интерактивный инструмент выбора с tty, он работает.

Есть ли опция fzf или vim длясделать эту работу?

1 Ответ

1 голос
/ 29 октября 2019

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