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
が、うまくいきませんでした。
誰でもポインタや説明をいただければ幸いです。ありがとう。