Preview Window Basics
The preview window is one of fzf's most powerful features. It shows a live preview of the currently highlighted item — file contents, git diffs, directory trees — updated in real time as you navigate.
Core Idea
--preview 'COMMAND {}' runs a shell command for every focused item. The {} is replaced with the current item. The command's output appears in a split panel.
Basic Preview
# Preview file contents as you navigate
ls | fzf --preview 'cat {}'
# With syntax highlighting (bat)
ls | fzf --preview 'bat --color=always {}'
# Directory preview with tree
ls -d */ | fzf --preview 'tree -C {} | head -100'
--preview-window — Control the Panel
# Position: right | left | up | down
fzf --preview 'cat {}' --preview-window=right
fzf --preview 'cat {}' --preview-window=down
fzf --preview 'cat {}' --preview-window=left
# Size: percentage or absolute lines
fzf --preview 'cat {}' --preview-window=right:60%
fzf --preview 'cat {}' --preview-window=down:20
fzf --preview 'cat {}' --preview-window=right:50%:border-left
# Start hidden (toggle with key)
fzf --preview 'cat {}' --preview-window=right:hidden
Preview Window Options
# Multiple options separated by colon
--preview-window=right:60%:border-left:wrap:~3
# ^pos ^size ^border ^wrap ^header lines pinned
| Option | Effect |
|---|---|
right/left/up/down | Position of preview panel |
60% or 30 | Width/height (% or lines) |
hidden | Start hidden |
wrap | Wrap long lines |
nofollow | Don't follow the cursor |
noscroll | Disable scroll in preview |
border-left/right/top/bottom/none | Border side |
~N | Pin first N lines as header |
+N | Scroll preview to line N |
Using bat for Syntax Highlighting
# Full bat preview
ls | fzf --preview 'bat --color=always --style=numbers,changes,header {}'
# With line range limit (performance)
ls | fzf --preview 'bat --color=always --style=numbers --line-range=:300 {}'
# Highlight a specific line in preview
ls | fzf --preview 'bat --color=always --style=numbers --highlight-line=10 {}'
Using cat with Fallback
# bat if available, fall back to cat
ls | fzf --preview '(bat --color=always {} 2>/dev/null || cat {}) 2>/dev/null'
Directory Preview with tree or eza
# Directory tree
find . -type d | fzf --preview 'tree -C -L 3 {} | head -100'
# Modern eza (if installed)
find . -type d | fzf --preview 'eza --tree --color=always --icons {} | head -100'
# File or dir — handle both
find . | fzf --preview '
if [ -d {} ]; then
tree -C -L 2 {}
else
bat --color=always --style=numbers {}
fi
'
Scrolling the Preview
| Key (default) | Action |
|---|---|
Shift+↑ | Scroll preview up |
Shift+↓ | Scroll preview down |
(custom) Ctrl+u | Half page up in preview |
(custom) Ctrl+d | Half page down in preview |
Add scroll bindings:
fzf --preview 'bat --color=always {}' \
--bind 'ctrl-u:preview-half-page-up' \
--bind 'ctrl-d:preview-half-page-down' \
--bind 'ctrl-f:preview-page-down' \
--bind 'ctrl-b:preview-page-up'
Toggling Preview
# CTRL-/ to show/hide
fzf --preview 'bat --color=always {}' \
--preview-window=right:hidden \
--bind 'ctrl-/:toggle-preview'
Scrolling to a Specific Line in Preview
# Jump to a line number embedded in the selection
# (useful when input contains "filename:lineno")
grep -rn "TODO" . | fzf --delimiter=: \
--preview 'bat --color=always --highlight-line={2} {1}' \
--preview-window '+{2}/2'
# +{2}/2 means: scroll preview to line {2}, center it