Mengatur fzf secara global lewat FZF_DEFAULT_COMMAND dan FZF_DEFAULT_OPTS, menyesuaikan tiap keybinding dengan variabel per-bind, serta menerapkan pola konfigurasi terbaik agar pengaturan konsisten dan mudah dikelola.

Di episode 7 kalian melihat sekilas variabel seperti FZF_CTRL_T_COMMAND dan FZF_CTRL_R_OPTS. Episode 8 menyatukan semuanya: fzf membaca pengaturan dari environment variables yang dibentuk sistematis, dan memahami pola ini adalah kunci untuk mengelola fzf tanpa mengacaukan satu sama lain. Semuanya berawal dari baris export sederhana seperti export FZF_DEFAULT_OPTS="--height=40%".
Anggap setiap invocation fzf adalah pesawat. Variabel FZF_DEFAULT_OPTS adalah setelan kabin global (semua pesawat sama), sedangkan variabel per-keybinding adalah setelan khusus untuk satu rute. Kalau kalian menebak-nebak tanpa memahami hierarki ini, hasilnya konflik pengaturan yang sulit ditelusuri.
Semua konfigurasi fzf dialirkan lewat environment variables dengan dua keluarga:
| Keluarga | Arti |
|---|---|
FZF_DEFAULT_* | Berlaku global: seluruh invocation fzf |
FZF_CTRL_T_*, FZF_CTRL_R_*, FZF_ALT_C_* | Berlaku untuk keybinding tertentu saja |
Selain itu ada FZF_COMPLETION_* (untuk fuzzy completion, episode 9) dan FZF_TMUX_* (untuk integrasi tmux, episode tersendiri). Pola penamaannya selalu sama: FZF_<KONTEKS>_<PERAN> di mana COMMAND menentukan sumber data dan OPTS menentukan opsi baris perintah.
Ketika input fzf tidak dipipe (misal kalian mengetik fzf langsung), fzf butuh sumber data. Defaultnya adalah walking directory sederhana, tapi kalian bisa menggantinya dengan perintah apa pun:
export FZF_DEFAULT_COMMAND="find . -type f -not -path '*/.git/*'"Penting untuk dipahami: FZF_DEFAULT_COMMAND berlaku ketika fzf dijalankan tanpa stdin. Untuk keybinding seperti CTRL-T, sumber datanya diambil dari variabel khusus masing-masing (bukan langsung dari variabel ini) — detailnya di bagian bawah. Gunakan variabel ini untuk daftar file apa pun yang sering kalian buka, misalnya menggabungkan beberapa direktori proyek:
export FZF_DEFAULT_COMMAND="find ~/code ~/docs -type f 2>/dev/null"Note
Kesalahan umum adalah menyimpan banyak opsi di FZF_DEFAULT_COMMAND. Variabel ini hanya untuk perintah penghasil data; opsi seperti layout, preview, dan warna masuk ke FZF_DEFAULT_OPTS — jangan dicampur.
Ini adalah variabel paling penting. Semua opsi yang kalian pelajari sejak episode 4 — --height, --layout, --border, --color, --preview, --bind — bisa dikumpulkan di sini agar setiap pemanggilan fzf konsisten:
export FZF_DEFAULT_OPTS="--height=40% --layout=reverse --border --info=inline \
--preview='bat --color=always --style=numbers --line-range=:200 {}' \
--color=prompt:#50fa7b,pointer:#ff79c6,hl:#bd93f9"Important
Perhatikan tanda kutip di atas. Karena nilai variabel dipecah oleh shell seperti argumen, opsi yang mengandung spasi harus dikutip di dalam nilainya. --preview='bat ... {}' di dalam tanda kutip ganda luar akan disimpan sebagai satu argumen utuh — kutipan dalam dipertahankan, bukan dihapus oleh shell.
Ada satu lagi yang sering terlewat: FZF_DEFAULT_OPTS_FILE. Jika pengaturan kalian sangat panjang, pindahkan isi FZF_DEFAULT_OPTS ke file dan arahkan variabel ini ke file tersebut:
export FZF_DEFAULT_OPTS_FILE="$HOME/.config/fzf/opts"Manfaatnya: opsi tidak lagi terikat escape quoting shell, bisa diberi komentar, dan lebih mudah di-version control. Fzf tetap membaca FZF_DEFAULT_OPTS dan FZF_DEFAULT_OPTS_FILE sekaligus — keduanya digabung.
Setiap keybinding dari episode 7 punya pasangan variabel COMMAND dan OPTS. Mereka mengatur sumber data dan opsi untuk invocation fzf tertentu, dan menimpa atau menambahkan di atas FZF_DEFAULT_OPTS:
| Variabel | Keybinding | Peran |
|---|---|---|
FZF_CTRL_T_COMMAND | CTRL-T | Sumber file/direktori |
FZF_CTRL_T_OPTS | CTRL-T | Opsi khusus |
FZF_CTRL_R_OPTS | CTRL-R | Opsi khusus (history) |
FZF_ALT_C_COMMAND | ALT-C | Sumber direktori |
FZF_ALT_C_OPTS | ALT-C | Opsi khusus |
Perhatikan: tidak ada FZF_CTRL_R_COMMAND — sumber CTRL-R sudah pasti riwayat shell, tidak bisa diganti. Ini konsisten dengan cara kerja episode 7.
Berikut kombinasi khas: CTRL-R memakai skema history, sementara CTRL-T memakai preview dan pemilihan banyak:
export FZF_CTRL_R_OPTS="--scheme=history --sort"
export FZF_CTRL_T_OPTS="--preview='bat --color=always {}' --multi"Karena OPTS ditambahkan ke FZF_DEFAULT_OPTS, kalian tidak perlu mengulang opsi global di setiap variabel — cukup tambahkan yang khusus. Jika OPTS per-keybinding memuat opsi yang sama dengan global, nilai dari OPTS tersebut yang menang.
Pengaturan fzf terbaik adalah yang bisa dibaca orang lain dalam satu menit. Rekomendasinya: sekelompok blok yang rapi di akhir config, urut dari global ke spesifik.
# ---------- Fzf: sumber data global ----------
export FZF_DEFAULT_COMMAND="find . -type f -not -path '*/.git/*'"
# ---------- Fzf: opsi global ----------
export FZF_DEFAULT_OPTS="--height=40% --layout=reverse --border \
--info=inline --prompt='> ' \
--preview='bat --color=always --style=numbers --line-range=:200 {}' \
--color=prompt:#50fa7b,pointer:#ff79c6,hl:#bd93f9"
# ---------- Fzf: opsi per keybinding ----------
export FZF_CTRL_T_OPTS="--preview='ls -la' --multi"
export FZF_CTRL_R_OPTS="--scheme=history --sort"
export FZF_ALT_C_OPTS="--preview='ls -la'"
# ---------- Fzf: muat integrasi shell ----------
eval "$(fzf --bash)"Tip
Urutan itu penting: semua export harus selesai sebelum baris eval "$(fzf --bash)". Script integrasi membaca nilai variabel saat dimuat, sehingga variabel yang didefinisikan setelahnya tidak akan berpengaruh pada keybinding tersebut.
Satu kunci pengelolaan: karena CTRL-R hanya punya OPTS (tanpa COMMAND), dan sumber datanya sudah tetap, jangan buang waktu mencari variabel yang tidak ada. Pola penamaan FZF_<KONTEKS>_<PERAN> akan langsung memberitahu kalian apa yang bisa diubah.
Episode 8 ini membuat konfigurasi fzf kalian terpusat dan sistematis: FZF_DEFAULT_COMMAND untuk sumber data global, FZF_DEFAULT_OPTS untuk setelan global, variabel per-keybinding (FZF_CTRL_T_*, FZF_CTRL_R_OPTS, FZF_ALT_C_*) untuk penyesuaian khusus, FZF_DEFAULT_OPTS_FILE untuk opsi panjang, serta pola blok konfigurasi yang rapi.
Inti yang harus dibawa pulang:
FZF_DEFAULT_* berlaku global; variabel per-keybinding menambahkan di atasnya.COMMAND mengatur sumber data; OPTS mengatur opsi; CTRL-R hanya punya OPTS.Di episode 9, kita akan membahas fuzzy completion (**<TAB>) — cara fzf ikut melengkapi perintah, path, proses, hingga variabel lingkungan, plus membuat custom completer sendiri. Sampai jumpa di episode 9!