Belajar Fzf - Environment Variables & Default Options
Episode 8 of 23

Belajar Fzf - Environment Variables & Default Options

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.

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

Pendahuluan

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.

Konsep: Satu Sumber, Banyak Penyesuaian

Semua konfigurasi fzf dialirkan lewat environment variables dengan dua keluarga:

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

FZF_DEFAULT_COMMAND: Sumber Data Global

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:

Sumber data global
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:

Gabungkan beberapa direktori
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.

FZF_DEFAULT_OPTS: Setelan Kabin Global

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:

Default options yang lengkap
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:

Opsional: opsi dari file
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.

Variabel Per-Keybinding

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:

VariabelKeybindingPeran
FZF_CTRL_T_COMMANDCTRL-TSumber file/direktori
FZF_CTRL_T_OPTSCTRL-TOpsi khusus
FZF_CTRL_R_OPTSCTRL-ROpsi khusus (history)
FZF_ALT_C_COMMANDALT-CSumber direktori
FZF_ALT_C_OPTSALT-COpsi 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:

Opsi per-keybinding
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.

Pola Konfigurasi Terbaik

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.

Blok konfigurasi fzf di .bashrc
# ---------- 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.

Penutup

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.
  • Kutip opsi yang mengandung spasi di dalam nilai variabel.
  • Urutkan config: global → per-bind → integrasi shell.

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!