--with-nth
で特定の列だけを表示した上でフィルタリングがしたかったが、どうもできないらしい。
上記のIssueによると、できないというよりはそれを実装してしまうと混乱を招きそうだから実装しない、ということらしい。
何がしたかったのか
fzfの絞り込み結果は日本語で表示し、フィルタリングは英語で行う、ということをしたかった。
例えばこんなファイルがあるとする。
Ken.tsv
神奈川 Kanagawa 東京 Tokyo 横浜 Yokohama
このファイルをfzfに食わせると下記のようになる。
上記のように列が2つだけならこのままフィルタリングしていっても特に問題はない。
ただ列が多くなってきたときに、特定の列だけを表示した上でフィルタイングしたいときがある。
今回の場合だと、表示は神奈川県
などの日本語だけにして、フィルタリングはkanagawa
などローマ字でやりたいっていうケースですね。
そしてこれはできないよっていうのが冒頭のIssueになります。以下ポエム。
--nth,--with-nthについて
--nth
,--with-nth
は列(field)を扱うオプション。
ざっくり違いをまとめると以下。
--nth
はフィルタリングを適用させたい列を指定することができる--with-nth
は表示したい列を指定することができる
ちなみにnth
というのは4th
や5th
の数字の部分をNとした形のこと。いわゆる序数ってやつですね。
nth
系の挙動を下記のようなファイルで試してみる。
Ken.tsv
神奈川(kanagawaken) Kanagawa 東京(tokyoto) Tokyo 横浜(yokohamashi) Yokohama
--nth=1(1列目でフィルタリング)
まずは--nth
の挙動から確かめてみる。
cat Ken.tsv | fzf --nth=1
1列目の(kanagawaken)
でフィルタリングされている。
--nth=2(2列目でフィルタリング)
では--nth=2
にした場合どうなるか。
cat Ken.tsv | fzf --nth=2
2列目のKanagawa
でフィルタリングされている。
このように--nthはフィルタリングを適用させる列を指定することができる。
--with-nth=1(1列目だけ表示)
cat Ken.tsv | fzf --with-nth=1
1列目だけ表示されている。もちろん--with-nth=2
とすると2列目だけ表示される。
--with-nth=N..(N列目以降表示)
2..
のように..
を使用することでN列目以降を表現できる。
Ken.tsv
神奈川 Kanagawa 1234km 東京 Tokyo 5678km 横浜 Yokohama 10km
cat Ken.tsv | fzf --with-nth=2..
--nth,--with-nthを組み合わせれば非表示の列でフィルタリングできるんじゃない!?
下記のように--nth
と--with-nth
を組み合わせればいけると思った。
# フィルタリング対象を2列目、1列目だけを表示する cat Ken.tsv | fzf --nth=2 --with-nth=1
と思ったけどできなかった。これについては下記。
終わり
fzfを使い始めてからずっと疑問だったことが解消されたし、--nth
についてもちゃんと理解することができたので結果オーライ。
どうしてもやりたかったらForkして修正したものを使えばいいという選択肢があるだけで神。
ああfzf楽しい。