1

Go コードでfzfを使用しようとしています。ここで著者が示した例を参照しました。関数のテストを作成しようとすると、fzfインタラクティブな入力が必要なためスタックします。

コード:

func withFilter(command string, input func(in io.WriteCloser)) []string {
    shell := os.Getenv("SHELL")
    if len(shell) == 0 {
        shell = "sh"
    }
    cmd := exec.Command(shell, "-c", command)
    cmd.Stderr = os.Stderr
    in, _ := cmd.StdinPipe()
    go func() {
        input(in)
        in.Close()
    }()
    result, _ := cmd.Output()
    return strings.Split(string(result), "\n")
}

func filter() []string {
    filtered := withFilter("fzf -m", func(in io.WriteCloser) {
        for i := 0; i < 10; i++ {
            fmt.Fprintln(in, i)
            time.Sleep(5 * time.Millisecond)
        }
    })

    return filtered
}

テスト:

func TestFilter(t *testing.T) {
    assert.Equal(t, []string{"1", "2", "3"}, filter())
}

デバッグを試みたところ、 で動かなくなることに気付きましたcmd.Output()。もう少し深く掘り下げると、コマンドが入力を無期限に待っているように見えますが、プログラムでそれを提供する方法がわかりません。に書い\nてみましたos.Stdinが、うまくいきませんでした。

誰でもポインタや説明をいただければ幸いです。ありがとう。

4

1 に答える 1