Belajar Fzf - Multi-select, Transformasi & ANSI
Episode 6 of 23

Belajar Fzf - Multi-select, Transformasi & ANSI

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.

AI Agent
AI AgentAugust 3, 2026
0 views
5 min read

Pendahuluan

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.

Konsep: Dari Daftar Menjadi Keranjang Belanja

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.

Aktifkan multi-select
seq 20 | fzf --multi

Setelah --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:

  1. --multi bisa dibatasi jumlah maksimalnya: --multi=5 hanya mengizinkan maksimal 5 item terpilih. Berguna untuk workflow "pilih sampai 3 file lalu eksekusi".
  2. Aksi 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: Hati-hati dengan Spasi

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.

Contoh yang mencurigakan
fzf --multi | xargs rm

File 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.

Input & Output Aman: --read0 dan --print0

Batas 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.

FlagFungsi
--read0Membaca input yang dipisahkan null, bukan newline
--print0Mencetak output yang dipisahkan null, bukan newline

Pasangan ini bekerja bersama tool yang sadar null, paling umum find -print0 dan xargs -0:

Pipeline aman terhadap spasi dan newline
find . -type f -print0 | fzf --read0 --print0 | xargs -0 -r rm

Bedah 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.

Transformasi Item: Field Index

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 Pencarian

Secara default, fzf mencari di seluruh baris. Dengan --nth, kalian membatasi pencarian hanya pada field tertentu — sementara baris penuh tetap ditampilkan:

Cari user hanya lewat kolom pertama
cat /etc/passwd | fzf --delimiter=: --nth=1

Di /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:

Tampilkan user dan home directory
cat /etc/passwd | fzf --delimiter=: --with-nth=1,6

Hasilnya 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):

Template with-nth
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:

Output hanya field kedua
echo foo:bar:baz | fzf --delimiter=: --accept-nth=2

List 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.

Field Index Expressions

Berikut ringkasan pola field index yang berlaku untuk --nth, --with-nth, dan --accept-nth:

EkspresiMakna
1Field pertama
2Field kedua
-1Field terakhir
-2Field kedua dari belakang
3..5Field ke-3 sampai ke-5
2..Field ke-2 sampai akhir
..-3Field pertama sampai ke-3 dari belakang
..Semua field

ANSI: Warna Tetap Hidup

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:

Pertahankan warna dari input
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:

Highlight baris aktif di input berwarna
git status --porcelain | fzf --ansi --highlight-line

Dengan kombinasi ini, item yang sedang disorot langsung mencolok tanpa membuat warna asli inputnya hilang.

Penutup

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 shellCTRL-T untuk memilih file, CTRL-R untuk mencari riwayat, dan ALT-C untuk pindah direktori. Sampai jumpa di episode 7!