Belajar Fzf - Production-Ready Setup & Dotfiles
Series/Belajar Fzf/Episode 21
Episode 21 of 23

Belajar Fzf - Production-Ready Setup & Dotfiles

Menyiapkan fzf agar deterministik di semua mesin: menyimpan opsi FZF_* dan keybindings di repo dotfiles, konfigurasi yang konsisten di bash, zsh, fish, dan nushell, bootstrap otomatis untuk mesin baru, serta checklist produksi yang bisa ditinjau dan diuji.

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

Pendahuluan

Di episode 20 kalian meletakkan fzf di tengah ekosistem editor dan developer tools. Episode 21 ini menanyakan pertanyaan yang lebih praktis: apakah setup fzf kalian siap dibawa ke mesin lain? Ketika kalian mendapatkan laptop baru, server baru, atau membuat container dev baru — apakah pengalaman fzf kalian muncul dengan sendirinya, atau harus dikonfigurasi ulang dari nol?

Bayangkan setup fzf sebagai setelan pakaian kerja: nyaman di satu tubuh, tetapi jika tidak diukur ulang, tidak akan pas di tubuh lain. Repo dotfiles adalah "pola jahit" yang menyimpan ukuran itu — dan episode ini membuat pola tersebut deterministik: opsi yang sama, keybinding yang sama, bootstrap yang sama, di mana pun kalian berdiri.

Episode ini membahas struktur dotfiles untuk fzf, manajemen FZF_* dan keybindings, konfigurasi konsisten di bash/zsh/fish/nushell, bootstrap otomatis, dan checklist produksi yang bisa kalian jalankan untuk menguji setup sebelum dibawa ke produksi.

Struktur Dotfiles untuk Fzf

Kunci dari setup fzf yang rapi adalah satu sumber kebenaran untuk opsi, terpisah dari mekanisme per shell. Pola yang banyak dipakai oleh engineer senior:

plaintext
dotfiles/
├── fzf/
│   ├── fzf.bash
│   ├── fzf.zsh
│   └── fzf.fish
└── .bashrc, .zshrc, config.fish

Setiap file per shell berisi tiga hal: integrasi yang dibutuhkan shell itu (fzf dan fzf-tmux yang di-source), variabel FZF_*, dan keybindings opsional. Karena opsi FZF_DEFAULT_OPTS disimpan sebagai string biasa, isinya identik di ketiga file — kalian hanya perlu menjaga konsistensi:

fzf.zsh - bagian dari dotfiles
[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh
 
export FZF_DEFAULT_OPTS="
  --height 40%
  --layout reverse --border
  --multi --cycle
  --color fg:-1,bg:-1,hl:208,fg+:-1,bg+:-1,hl+:208
  --color info:215,pointer:208,marker:214,prompt:208
"
 
export FZF_CTRL_T_COMMAND='fd --type f --hidden --follow'
export FZF_CTRL_T_OPTS="--preview 'bat --color=always {}'"
Opsi inti sama untuk semua shell

Tip

Jika kustomisasi per shell dirasa berlebihan, ada jalan pintas yang valid: set FZF_DEFAULT_OPTS cukup di satu file dan export-kan ke environment — misalnya dari ~/.profile atau file env milik shell manager seperti direnv. Selama shell memuatnya, keybinding bawaan (CTRL-T, CTRL-R, ALT-C) akan memakainya. Tambahan FZF_* per shell hanya diperlukan untuk perilaku yang benar-benar berbeda per shell.

Bootstrap Otomatis di Mesin Baru

Dotfiles hanya berguna jika bisa dipasang ulang dengan satu perintah. Pola paling sederhana dan paling mudah di-audit adalah script bootstrap yang berurutan:

bootstrap.sh - pasang fzf dan dotfiles
#!/usr/bin/env bash
set -euo pipefail
 
command -v fzf >/dev/null || {
  echo "memasang fzf..."
  git clone --depth 1 https://github.com/junegunn/fzf ~/.fzf
  ~/.fzf/install --all --key-bindings --completion --no-update-rc
}
 
ln -sf "$PWD/fzf/fzf.zsh" ~/.fzf.zsh
ln -sf "$PWD/fzf/fzf.bash" ~/.fzf.bash
ln -sf "$PWD/fzf/fzf.fish" ~/.fzf.fish
idempoten: bisa dijalankan ulang tanpa merusak

Tiga sifat yang harus dimiliki setiap bootstrap:

  • Idempoten: menjalankannya dua kali tidak merusak apa pun — karena itu ln -sf dipakai untuk menimpa symlink, bukan ln -s.
  • Urutan jelas: install binary dulu, baru simlink konfigurasi, baru verifikasi.
  • Mudah diaudit: satu perintah per langkah, tidak ada logika yang menyembunyikan efek samping.

Note

Untuk mesin tanpa internet atau tanpa hak sudo, bootstrap bisa memakai paket yang sudah tersedia: apt install fzf, pacman -S fzf, brew install fzf, atau apk add fzf. Sesuaikan branch install di script bootstrap kalian dengan platform target — dan catat asumsinya di komentar README, bukan di dalam script.

Konsistensi di Bash, Zsh, dan Fish

Setiap shell punya cara memuat integrasi fzf yang berbeda, dan kegagalan paling umum pada setup lintas shell adalah mencampur sintaks. Mari petakan:

ShellMemuat integrasi fzfSintaks keybinding
bashsource ~/.fzf.bash di .bashrcCtrl-T, Ctrl-R, Alt-C
zshsource ~/.fzf.zsh di .zshrcsama seperti bash
fishfzf_key_bindings setelah fzf.fish di-sourceCtrl-T, Ctrl-R, Alt-C
nushellfzf --nushell menghasilkan module yang di-sourceCtrl-T, Ctrl-R, Alt-C

Perhatikan bahwa keybinding default (CTRL-T, CTRL-R, ALT-C) identik di keempat shell — konsistensi itulah yang membuat otot kalian tidak perlu belajar ulang saat berpindah mesin. Yang berbeda hanyalah cara memuatnya:

config.fish - muat fzf dengan fish
if command -q fzf
  fzf --fish | source
  fzf_key_bindings
end
env.nu - muat fzf dengan nushell
source ($"{(^fzf --nushell | to text)}"
Nushell membangkitkan module fzf lewat flag --nushell

Important

Jangan menyalin snippet satu shell ke shell lain tanpa menyesuaikan. fzf --fish | source tidak bisa dieksekusi di bash, dan source ~/.fzf.zsh tidak akan berfungsi di fish. Biarkan fzf membangkitkan integrasinya sendiri untuk setiap shell (fzf --bash, fzf --zsh, fzf --fish, fzf --nushell) — itulah cara yang dijamin konsisten antar versi.

Konfigurasi Per Proyek

Setiap proyek bisa meminta perilaku fzf yang berbeda — dan konfigurasi global tidak boleh dipaksa menyatukan semuanya. Di episode 8 kalian belajar opsi di FZF_DEFAULT_OPTS; di sini polanya diperluas dengan konfigurasi berlapis:

  1. Global (FZF_DEFAULT_OPTS): opsi yang selalu masuk akal — height, layout, warna, border.
  2. Per shell (FZF_CTRL_T_OPTS, FZF_CTRL_R_OPTS): penyesuaian untuk keybinding tertentu.
  3. Per proyek: skrip yang memanggil fzf dengan opsi khusus, atau alias yang disetel di file _local milik proyek.
  4. Per pemanggilan: flag baris perintah yang menang atas semuanya.

Prinsipnya: global itu minimal, spesifik itu eksplisit. Ketika kalian menambah opsi global, tanyakan "apakah ini masuk akal untuk semua proyek?" Jika tidak, opsi itu bukan untuk global.

fzf dengan profil warna per proyek
FZF_DEFAULT_OPTS='--color fg:120,pointer:120,hl:120' fzf
Flag baris perintah mengalahkan FZF_DEFAULT_OPTS

Tip

Cara terbaik untuk menguji apakah sebuah opsi pantas menjadi global: gunakan selama satu minggu di semua proyek. Jika tidak ada proyek yang merasa terganggu, promosikan ke FZF_DEFAULT_OPTS. Jika ada yang menolak, simpan sebagai konfigurasi khusus. Produksi adalah hasil dari pemakaian berulang, bukan dari perencanaan di depan.

Checklist Produksi

Setup yang siap produksi bisa diuji dengan checklist yang deterministik — bukan diukur dari "terasa nyaman", melainkan dari hasil yang bisa diverifikasi. Jalankan ini setiap kali menyetel ulang mesin:

#CekPerintah verifikasi
1Binary terpasangfzf --version
2Integrasi shell ter-loadketik echo $FZF_DEFAULT_OPTS — tidak kosong
3Keybindings aktiftekan Ctrl-T di shell
4Preview berfungsifd -t f | fzf --preview 'bat --color=always {}'
5History search jalanCtrl-R membuka fzf, bukan prompt bawaan
6Shell integration vim/nvim jalanvim mengenal FZF_DEFAULT_COMMAND bila diset
7Versi konsisten antar mesinbandingkan fzf --version dengan baseline tim
8fzf-tmux bekerjafzf-tmux -p 60% membuka panel tanpa error

Checklist ini sengaja pendek — delapan cek yang menjawab satu pertanyaan: "apakah pengalaman fzf yang sama muncul di mesin ini?" Jika ada yang gagal, catat di README dotfiles, bukan hanya diperbaiki sekali.

Warning

Versi yang tidak konsisten antar mesin adalah sumber bug paling halus. --listen di mesin A bisa bekerja karena 0.70+, sementara mesin B yang masih 0.69 gagal diam-diam. Untuk tim, pin baseline di file dotfiles — misalnya komentar # fzf >= 0.74.1 — dan jadikan fzf --version bagian dari bootstrap verification.

Kesalahan Umum

KesalahanGejalaSolusi
Mencampur sintaks shellKeybinding error di satu shell sajaPakai fzf --bash/zsh/fish/nushell sesuai shell
Bootstrap tidak idempotenMenjalankan dua kali menumpuk fileGunakan ln -sf, bukan ln -s
Opsi global terlalu banyakProyek tertentu terasa anehPertahankan global minimal; spesifik per proyek
Keybinding hilang di zshsource ~/.fzf.zsh terlewatPanggil di .zshrc, bukan di .bashrc
Preview gagal di mesin barubat tidak terpasangChecklist: verifikasi preview sebelum produksi
Versi fzf tidak konsistenPerilaku berbeda antar mesinPin baseline di README dotfiles

Penutup

Pada episode 21 ini kalian menyiapkan fzf agar deterministik lintas mesin: struktur dotfiles dengan satu sumber kebenaran per shell; bootstrap idempoten yang memasang binary lalu menghubungkan konfigurasi; konsistensi keybinding di bash, zsh, fish, dan nushell lewat integrasi yang dibangkitkan fzf sendiri; konfigurasi berlapis global-per-proyek; serta checklist produksi delapan langkah yang bisa diverifikasi setiap kali mesin disetel ulang.

Pesan untuk dibawa pulang: setup fzf yang produksi-ready bukan yang paling mewah, melainkan yang paling deterministik — bisa dipasang ulang, diuji, dan diaudit dengan perintah yang sama di mana pun.

Setelah menempuh 21 episode, waktunya melihat ke belakang — dan ke samping. Di episode terakhir, episode 22, kita membahas ekosistem alternatif & refleksi akhir: membandingkan fzf dengan skim, percol, peco, pick, dan fzy; mengenal fzf sebagai library Go; merangkum perjalanan episode 0 sampai 21; serta menutup series dengan checklist daily driver dan pesan untuk dibawa pulang.

Belajar Fzf - Production-Ready Setup & Dotfiles | Belajar Fzf