まず go get
で最新バージョンをインストールしてください。
$ go get -u github.com/koki-develop/go-fzf
次に go-fzf を import してください。
import "github.com/koki-develop/go-fzf"
まず fzf.New()
で Fuzzy Finder を初期化します。
f, err := fzf.New()
if err != nil {
// ...
}
次に Find()
を実行すると Fuzzy Finder が起動します。
第一引数には検索対象のアイテムの slice を渡します。
第二引数には i 番目のアイテムのテキストを返す関数を渡します。
idxs, err := f.Find(items, func(i int) string { return items[i] })
if err != nil {
// ...
}
fzf.WithLimit()
を使用すると選択できるアイテムの数を設定できます。
f, err := fzf.New(fzf.WithLimit(4))
if err != nil {
// ...
}
fzf.WithNoLimit()
を使用するとアイテムを無制限に選択できるようになります。
f, err := fzf.New(fzf.WithNoLimit(true)) // no limit
if err != nil {
// ...
}
fzf.WithCaseSensitive()
を使用するとあいまい検索で大文字/小文字を区別するようにできます。
f, err := fzf.New(fzf.WithCaseSensitive(true))
if err != nil {
// ...
}
fzf.WithKeyMap()
を使用するとキーマップをカスタマイズできます。
カスタマイズできるキーマップは次の通りです。
Up
- カーソルを上に移動するDown
- カーソルを下に移動するToggle
- アイテムを選択もしくは選択解除するChoose
- 検索を完了するAbort
- 検索を中止する。
f, err := fzf.New(
fzf.WithNoLimit(true),
fzf.WithKeyMap(fzf.KeyMap{
Up: []string{"up", "ctrl+b"}, // ↑, Ctrl+b
Down: []string{"down", "ctrl+f"}, // ↓, Ctrl+f
Toggle: []string{"tab"}, // tab
Choose: []string{"enter"}, // Enter
Abort: []string{"esc"}, // esc
}),
)
if err != nil {
// ...
}
fzf.WithHotReload()
を使用するとホットリロードを有効にできます。
var items []string
var mu sync.Mutex
go func() {
i := 0
for {
time.Sleep(50 * time.Millisecond)
mu.Lock()
items = append(items, strconv.Itoa(i))
mu.Unlock()
i++
}
}()
f, err := fzf.New(fzf.WithHotReload(&mu))
if err != nil {
// ...
}
// NOTE: slice のポインタを渡す必要があることに注意してください。
idxs, err := f.Find(&items, func(i int) string { return items[i] })
if err != nil {
// ...
}
fzf.WithPrompt()
を使用するとプロンプトの文字列を設定できます。
f, err := fzf.New(fzf.WithPrompt("=> "))
if err != nil {
// ...
}
fzf.WithCursor()
を使用するとカーソルの文字列を設定できます。
f, err := fzf.New(fzf.WithCursor("=> "))
if err != nil {
// ...
}
fzf.WithSelectedPrefix()
を使用すると選択中アイテムの接頭辞を設定できます。
同じ様に fzf.WithUnselectedPrefix()
を使用すると未選択アイテムの接頭辞を設定できます。
f, err := fzf.New(
fzf.WithSelectedPrefix("[x] "),
fzf.WithUnselectedPrefix("[ ] "),
)
if err != nil {
// ...
}
fzf.WithInputPlaceholder()
を使用するとインプットのプレースホルダを設定できます。
f, err := fzf.New(fzf.WithInputPlaceholder("Search..."))
if err != nil {
// ...
}
fzf.WithCountViewEnabled()
を使用するとカウントビューの有効/無効を切り替えることができます ( デフォルトは有効 ) 。
fzf.WithCountView()
を使用するとカウントビューをレンダリングする関数を設定することができます。
関数の引数にはカウントビューに必要な情報が含まれる fzf.CountViewMeta
構造体が渡されます。
f, err := fzf.New(
fzf.WithNoLimit(true),
fzf.WithCountViewEnabled(true),
fzf.WithCountView(func(meta fzf.CountViewMeta) string {
return fmt.Sprintf("items: %d, selected: %d", meta.ItemsCount, meta.SelectedCount)
}),
)
if err != nil {
// ...
}
fzf.WithStyles()
を使用すると各コンポーネントのスタイルを設定することができます。
使用できるスタイルについてはリファレンスをご参照ください。
f, err := fzf.New(
fzf.WithNoLimit(true),
fzf.WithStyles(
fzf.WithStylePrompt(fzf.Style{Faint: true}), // プロンプト
fzf.WithStyleInputPlaceholder(fzf.Style{Faint: true, ForegroundColor: "#ff0000"}), // インプットのプレースホルダ
fzf.WithStyleInputText(fzf.Style{Italic: true}), // インプットのテキスト
fzf.WithStyleCursor(fzf.Style{Bold: true}), // カーソル
fzf.WithStyleCursorLine(fzf.Style{Bold: true}), // カーソル行
fzf.WithStyleMatches(fzf.Style{ForegroundColor: "#ff0000"}), // 一致文字
fzf.WithStyleSelectedPrefix(fzf.Style{ForegroundColor: "#ff0000"}), // 選択中アイテムの接頭辞
fzf.WithStyleUnselectedPrefix(fzf.Style{Faint: true}), // 未選択のアイテムの接頭辞
),
)
if err != nil {
// ...
}