Installing fzf directly into your shell with built-in keybindings: CTRL-T to select files or directories, CTRL-R to search command history, and ALT-C to change directories, complete with customization and how to disable them.

So far you have been calling fzf explicitly: typing cat daftar.txt | fzf, selecting, then passing the result on. Episode 7 removes that manual step with shell integration — fzf merges with your shell, appears via a keybinding, and makes use of data sources that already exist: the filesystem, command history, and directories. The foundation is one line: eval "$(fzf --bash)".
This is a paradigm shift, not just an added feature. After this episode, you will never again press the up arrow repeatedly to search for an old command, or type a long path to open a file. fzf becomes part of the way you type.
Shell integration makes fzf act as a widget that lives inside your shell — like a smart autocomplete you can summon at any time. fzf generates a shell-specific integration script, and you evaluate it once in your config file. This script registers three core keybindings:
| Keybinding | Function |
|---|---|
CTRL-T | Shows files & directories; the resulting path is pasted onto the command line |
CTRL-R | Searches the command history you've run |
ALT-C | Shows directories; the result immediately becomes a cd |
Think of CTRL-R as a time machine for commands: instead of scrolling through history with the up arrow, you type a keyword and filter thousands of history lines in an instant. Likewise CTRL-T — the shell's Spotlight for the files around you.
fzf provides a flag for each shell. The pattern is always the same: ask fzf to print a script, then load the result.
eval "$(fzf --bash)"Put the integration line in your shell config file — ~/.bashrc, ~/.zshrc, or ~/.config/fish/config.fish — after the definitions of FZF_* variables (which we cover in episode 8), so those values are read when the integration script loads. After that, open a new terminal and try CTRL-R once; you will see fzf floating over your command history.
Tip
The integration script is evaluated every time a new shell opens, not when fzf runs. That's why changes to FZF_CTRL_T_COMMAND or similar only take effect in the next shell session — remember to source ~/.bashrc after editing.
CTRL-T is the most used keybinding. When pressed, fzf shows files (and directories) under the working directory, and the resulting path is inserted into the command line you are typing. A real flow example:
nvim <tekan CTRL-T>You type nvim then press CTRL-T — a file list appears, you pick one with fuzzy search, and the command line becomes nvim path/ke/file. No path typos, no Tab fighting with built-in autocomplete.
The default list source is fzf's built-in command (directory walking), but you can replace it with FZF_CTRL_T_COMMAND. This is useful for filtering file types, for example Markdown only:
export FZF_CTRL_T_COMMAND="find . -name '*.md' -type f"Note
Since fzf 0.48, the built-in shell integration already includes automatic preview for CTRL-T and ALT-C: the highlighted file's contents are shown in the preview window immediately, with no extra configuration. This is an important reason to always keep fzf updated.
CTRL-R replaces the shell's built-in history search, which is usually linear (up arrow) or prefix-based (classic bash Ctrl-R). With fzf, history becomes a fuzzily filterable list: type docker build, and every history line containing both appears, pick the best one.
Because history is a fixed data source, there is no FZF_CTRL_R_COMMAND — but you can tune its behavior with FZF_CTRL_R_OPTS:
export FZF_CTRL_R_OPTS="--scheme=history --sort"--scheme=history optimizes score assessment for time-ordered data (items appearing later in history are rewarded more), and --sort ensures results are ordered by relevance, not by order of appearance. The details of --scheme will be covered in the episode about search optimization.
Caution
History can hold secrets: tokens, passwords, connection strings. CTRL-R shows them all effortlessly — make sure your habits don't type raw credentials on the command line, or clean history periodically with history -c (bash) and fc -W/removing ~/.zsh_history.
ALT-C performs a fuzzy cd: it shows a list of directories, and as soon as one is selected, the shell moves there. Imagine reaching ~/proyek/belajar-fzf/episode-7 from anywhere by typing just a few letters — no path copying, no repeated cd ...
Like CTRL-T, its data source can be customized with FZF_ALT_C_COMMAND, and its behavior with FZF_ALT_C_OPTS:
export FZF_ALT_C_COMMAND="find . -type d -not -path '*/node_modules/*' -not -path '*/.git/*'"
export FZF_ALT_C_OPTS="--preview 'ls -la'"The example above filters out node_modules and .git directories so the cd list stays clean, and shows the contents of the highlighted directory in the preview — so you don't have to guess what's inside.
There are two levels of "turning off": disabling the entire integration, or disabling a specific keybinding.
To turn everything off, simply don't load the integration line in your config — delete or comment out the eval/source line. All fzf keybindings disappear, and the shell returns to normal.
To turn off just one keybinding (for example, CTRL-T conflicting with your habits):
| Shell | Command |
|---|---|
| Bash | bind -r '"\C-t"' |
| Zsh | bindkey -r '^T' |
| Fish | bind -e fzf-file-widget |
These lines can be placed in your config after the integration is loaded. The widget names in fish: fzf-file-widget for CTRL-T, fzf-history-widget for CTRL-R, and fzf-cd-widget for ALT-C.
Important
Disabling the integration also disables fuzzy completion (**<TAB>), which we cover in episode 9 — because both are installed from the same script. If you only want to disable the built-in CTRL-T/ALT-C preview, set FZF_CTRL_T_OPTS or FZF_ALT_C_OPTS to an empty value or --no-preview, without having to kill the keybinding.
Episode 7 installed fzf into your shell: per-shell integration (bash, zsh, fish, nushell), three core keybindings (CTRL-T for files/directories, CTRL-R for history, ALT-C for cd), customization via FZF_CTRL_T_COMMAND, FZF_CTRL_R_OPTS, and FZF_ALT_C_*, and how to disable them partially or entirely.
The key takeaways:
eval/source line in your shell config.CTRL-T selects files, CTRL-R searches history, ALT-C changes directories.CTRL-T/ALT-C has been active since fzf 0.48.FZF_* variables.In episode 8, we will bring all those FZF_* variables to the surface: environment variables & default options — FZF_DEFAULT_COMMAND, FZF_DEFAULT_OPTS, and the best configuration patterns to keep all your fzf settings consistent in one place. See you in episode 8!