Menguasai mode multi-select untuk memilih banyak item sekaligus, mengamankan input dan output dengan pembatas null, mentransformasi field item, dan menampilkan warna ANSI dari input ke dalam antarmuka fzf.

Di episode 5 kalian belajar memilih dan keluar dari fzf — termasuk mencicipi multi-select dengan Tab dan --multi. Kali ini kita menuntaskannya. Episode ini membahas multi-select, transformasi, dan ANSI, tiga kemampuan yang mengubah fzf dari daftar biasa menjadi alat pemroses daftar sungguhan.
Satu hal yang akan kita tekankan sejak awal: fzf hanyalah filter. Ia menerima daftar teks, mempersempitnya secara fuzzy, lalu mencetak pilihan. Semua kekuatan fzf ada di cara kita mengendalikan input dan output di kedua sisi filter itu. Episode ini memberi kalian kendali penuh pada keduanya. Contoh singkatnya: seq 20 | fzf --multi sudah memilih banyak item hanya dengan dua flag.
Mode default fzf berperilaku seperti kasir di toko: kalian menyerahkan satu barang, ia memprosesnya, selesai. Mode multi-select mengubahnya menjadi keranjang belanja — kalian menandai banyak item, lalu seluruh pilihan keluar sekaligus pada satu Enter.
seq 20 | fzf --multiSetelah --multi aktif, Tab dan Shift+Tab menandai dan membatalkan tanda item aktif — ingat marker dari episode 4, itulah penanda yang muncul di samping item terpilih. Setiap kali kalian menekan Enter, fzf mencetak semua item terpilih, satu per baris.
Dua perilaku --multi yang sering mengejutkan pemula:
--multi bisa dibatasi jumlah maksimalnya: --multi=5 hanya mengizinkan maksimal 5 item terpilih. Berguna untuk workflow "pilih sampai 3 file lalu eksekusi".select-all dan deselect-all bisa diikat ke tombol lewat --bind — misal --bind 'ctrl-a:select-all' — sehingga kalian bisa menandai seluruh hasil filter tanpa menekan Tab puluhan kali. Keybindings kustom akan kita bedah dalam episode tersendiri.Caution
Tanpa --multi, Tab tidak melakukan apa-apa. Ini perilaku yang sengaja dibuat: satu-satunya cara menandai banyak item adalah mengaktifkan mode-nya terlebih dahulu. Kalau Tab terasa "mati", cek apakah --multi sudah terpasang.
Output multi-select adalah satu baris per item. Ini terdengar sederhana, tapi menyimpan jebakan klasik: kalau kalian meneruskan hasilnya ke xargs tanpa perlakuan khusus, spasi di dalam nama file akan memecah satu nama menjadi banyak argumen.
fzf --multi | xargs rmFile laporan 2026.pdf akan dipecah menjadi laporan dan 2026.pdf — dua argumen berbeda. Untungnya fzf menyediakan dua flag khusus untuk masalah ini, dan itulah topik berikutnya.
--read0 dan --print0Batas antara satu item dan item lainnya di fzf secara default adalah karakter newline. Masalahnya, nama file di Linux boleh mengandung newline, tab, atau spasi — kombinasi yang bisa membuat pipeline kalian salah terurai. Solusinya adalah pembatas null (\0): karakter yang secara teknis tidak bisa muncul di dalam nama file, sehingga aman sebagai pemisah.
| Flag | Fungsi |
|---|---|
--read0 | Membaca input yang dipisahkan null, bukan newline |
--print0 | Mencetak output yang dipisahkan null, bukan newline |
Pasangan ini bekerja bersama tool yang sadar null, paling umum find -print0 dan xargs -0:
find . -type f -print0 | fzf --read0 --print0 | xargs -0 -r rmBedah baris di atas: find -print0 mengeluarkan path dengan pemisah null; --read0 memberi tahu fzf bahwa item dipisah null; --print0 membuat output fzf tetap berformat null; xargs -0 menerima format itu; dan -r mencegah rm berjalan tanpa input. Dengan pola ini, laporan 2026.pdf tetap satu argumen utuh.
Tip
Aturan praktis: begitu salah satu ujung pipeline memakai null, semua ujung harus ikut memakai null. Menyamakan pembatas hanya di sebagian rantai akan menghasilkan output yang ikut terpecah atau malah menyatu.
Tidak semua input fzf berbentuk daftar nama file. Seringkali kalian memfilter output yang berstruktur kolom — hasil ls -l, /etc/passwd, log, atau CSV. Untuk daftar seperti ini, fzf menyediakan tiga flag yang bekerja sama: --delimiter, --nth, dan --with-nth.
Bayangkan setiap baris sebagai kartu nama: ada field nama, jabatan, dan email. --delimiter menentukan pemisah antar field (defaultnya spasi dan tab), --nth menentukan field mana yang ikut dicari, dan --with-nth menentukan field mana yang ditampilkan. Ini memisahkan "apa yang kalian cari" dari "apa yang kalian lihat".
--delimiter dan --nth: Menyempitkan Scope PencarianSecara default, fzf mencari di seluruh baris. Dengan --nth, kalian membatasi pencarian hanya pada field tertentu — sementara baris penuh tetap ditampilkan:
cat /etc/passwd | fzf --delimiter=: --nth=1Di /etc/passwd, baris berbentuk root:x:0:0:root:/root:/bin/bash. Dengan --delimiter=: dan --nth=1, query admin hanya mencocokkan field pertama — kalian tidak akan mendapat hasil palsu dari path home yang mengandung kata yang sama.
--with-nth: Mengubah Tampilan--with-nth mentransformasi presentasi baris. Sintaks termudahnya adalah daftar indeks field, dengan .. sebagai rentang dan -1 sebagai field terakhir:
cat /etc/passwd | fzf --delimiter=: --with-nth=1,6Hasilnya tiap baris hanya menampilkan field 1 (user) dan field 6 (home), dipisah delimiter. Untuk kendali lebih, --with-nth menerima template dengan kurung kurawal, termasuk {n} untuk nomor urut baris (berbasis nol):
echo foo,bar,baz | fzf --delimiter=, --with-nth='{n},{1},{3},{2},{1..2}'Important
Dua konsekuensi penting: karena fzf mencari di field yang sudah ditransformasi --with-nth, kalian tidak bisa mencari field yang disembunyikan oleh --with-nth — kecuali menyebutkannya juga di --nth. Selain itu, --with-nth membuat fzf menyimpan baris asli di memori, jadi hanya gunakan ketika transformasi benar-benar dibutuhkan.
--accept-nth: Transformasi Hanya Saat Menerima--with-nth mengubah tampilan di layar. Tapi ada kasus lain: kalian ingin menampilkan baris penuh (atau field informatif) untuk browsing, namun output saat Enter hanya field tertentu. Di situlah --accept-nth bekerja:
echo foo:bar:baz | fzf --delimiter=: --accept-nth=2List menampilkan foo:bar:baz, tetapi yang dicetak saat Enter adalah bar. Ini kombinasi --with-nth + --accept-nth yang umum untuk data tabular: tampilkan konteks lebar, keluarkan nilai yang bisa langsung dipakai script. --accept-nth juga menerima template kurung kurawal seperti --with-nth.
Berikut ringkasan pola field index yang berlaku untuk --nth, --with-nth, dan --accept-nth:
| Ekspresi | Makna |
|---|---|
1 | Field pertama |
2 | Field kedua |
-1 | Field terakhir |
-2 | Field kedua dari belakang |
3..5 | Field ke-3 sampai ke-5 |
2.. | Field ke-2 sampai akhir |
..-3 | Field pertama sampai ke-3 dari belakang |
.. | Semua field |
Output berwarna — dari ls --color, git status, rg, hingga bat — mengandung ANSI escape code di balik layar. Secara default fzf mengabaikan kode ini dan menampilkan teks polos. Jika kalian ingin warnanya tampil, aktifkan --ansi:
ls --color=always | fzf --ansi--color=always memaksa ls mengeluarkan kode warna meski outputnya bukan terminal (dipipe ke fzf). Tanpa --ansi, warna itu dibuang; dengan --ansi, fzf mengurai kode-nya dan merender ulang dengan palet warnanya sendiri.
Important
Banyak tool hanya mengeluarkan warna saat output dianggap terminal (TTY). Dipipe ke fzf, mereka berhenti mewarnai. Solusinya selalu menambahkan flag "always" — --color=always untuk ls dan rg, --color=always untuk bat — supaya escape code tetap ikut mengalir ke fzf.
Saat --ansi aktif, --highlight-line membuat seluruh baris aktif di-highlight, bukan hanya bagian yang cocok dengan query. Ini sangat membantu membaca baris berwarna panjang — misalnya hasil git status:
git status --porcelain | fzf --ansi --highlight-lineDengan kombinasi ini, item yang sedang disorot langsung mencolok tanpa membuat warna asli inputnya hilang.
Episode 6 ini menutup fase "pemrosesan daftar": kalian kini bisa memilih banyak item dengan --multi (plus select-all/deselect-all), mengamankan pipeline terhadap spasi dan newline dengan --read0/--print0, memotong-motong baris berstruktur dengan --delimiter, --nth, --with-nth, dan --accept-nth, serta mempertahankan warna asli input lewat --ansi dan --highlight-line.
Inti yang harus dibawa pulang:
--multi mengubah fzf menjadi keranjang belanja; Tab menandai, Enter mengumpulkan.--read0/--print0 + find -print0 + xargs -0 membuat pipeline kebal terhadap spasi.--delimiter memotong baris jadi field; --nth mengatur yang dicari; --with-nth mengatur yang dilihat; --accept-nth mengatur yang dicetak.--ansi menghidupkan warna input; --highlight-line menandai baris aktif.Namun semua ini masih berjalan di dalam fzf. Di episode 7, kita akan menarik fzf keluar dari baris perintah terpisah dan menanamkannya langsung ke dalam shell — CTRL-T untuk memilih file, CTRL-R untuk mencari riwayat, dan ALT-C untuk pindah direktori. Sampai jumpa di episode 7!