fzf(1) fzf - a command-line fuzzy finder fzf(1) (NAME) fzf - (SYNOPSIS) fzf [] (DESCRIPTION) fzf . <<>> . (OPTIONS) (NOTE) --no- . (SEARCH) -x, --extended (Extended-search). . +x --no-extended . -e, --exact (Exact- match). -i, --ignore-case (: smart-case). +i, --no-ignore-case . --smart-case (). . --literal ( ). --scheme=SCHEME (Scoring scheme) . default . path . default . --tiebreak=pathname,length . history . . --tiebreak=index . fzf path TTY fzf $FZF_DEFAULT_COMMAND reload transform start . default . --algo=TYPE (: v2) v2 () v1 () -n, --nth=N[,..] . FIELD INDEX EXPRESSION . --with-nth ( --preview ) fzf . --with-nth=N[,..] or TEMPLATE . . . {n} . : # : echo foo bar baz | fzf --with-nth 2.. # echo foo,bar,baz | fzf --delimiter , --with-nth '{n},{1},{3},{2},{1..2}' change-with-nth --with-nth . --with-nth fzf ( --with-nth .. ). --with-nth . --accept-nth=N[,..] or TEMPLATE (Accept) . . . . {n} . : # echo foo bar baz | fzf --accept-nth 2 # echo foo bar baz | fzf --accept-nth 'Index: {n}, 1st: {1}, 2nd: {2}, 3rd: {3}' +s, --no-sort -d, --delimiter=STR (Regex) --nth --with-nth (: AWK). --tail=NUM . ( ) fzf . : # tail -f *.log | fzf --tail 100000 --tac --no-sort --exact --disabled . fzf << >> . enable-search toggle-search . --tiebreak=CRI[,..] . length chunk ( ) pathname begin end index - - index - index - length ( length,index) - end fzf / (INPUT/OUTPUT) --read0 NUL --print0 NUL --ansi ANSI --sync (Synchronous) . fzf ( start load result result-final focus ) . : # fzf fzf --multi | fzf --sync # fzf (sleep 1; seq 1000000; sleep 1) | fzf --sync --query 5 --listen --bind start:up,load:up,result:up,focus:change-header:Ready --no-tty-default TTY (stderr) /dev/tty . emacsclient fzf . TTY --tty-default=DEVICE_NAME . (GLOBAL STYLE) --style=PRESET [default|minimal|full[:BORDER_STYLE]] --color=[BASE_SCHEME][,COLOR_NAME[:ANSI_COLOR][:ANSI_ATTRIBUTES]]... . . / . (BASE SCHEME): (: dark base16 NO_COLOR bw) dark light base16 ( : 16) bw ( --no-color) (COLOR NAMES): fg list-fg selected-fg preview-fg bg list-bg selected-bg preview-bg input-bg header-bg footer-bg hl selected-hl current-fg (fg+) ( ) current-bg (bg+) ( ) gutter (Gutter) current-hl (hl+) ( ) alt-bg alt-gutter query (input-fg) (Query) ghost (--ghost dim ) disabled (--disabled) info ( ) border (--border --preview) list-border (--list-border) scrollbar separator gap-line (Gap) preview-border (--preview) preview-scrollbar input-border (--input-border) header-border (--header-border) footer-border (--footer-border) label (--border-label --list-label --input-label --preview-label) list-label (--list-label) preview-label (--preview-label) input-label (--input-label) header-label (--header-label) footer-label (--footer-label) prompt (Prompt) pointer marker spinner (Spinner) header (header-fg) footer (footer-fg) nth --nth ( ) nomatch (: dim) (ANSI COLORS): -1 / ( ) 0 ~ 15 black red green yellow blue magenta cyan white bright-black (gray | grey) bright-red bright-green bright-yellow bright-blue bright-magenta bright-cyan bright-white 16 ~ 255 ANSI #rrggbb (ANSI ATTRIBUTES): ( ) regular strip bold underline underline-double underline-curly underline-dotted underline-dashed reverse dim italic strikethrough (EXAMPLES): # Seoul256 # (https://github.com/junegunn/seoul256.vim) fzf --color='bg:237,bg+:236,info:143,border:240,spinner:108' \ --color='hl:65,fg:252,header:65,fg+:252' \ --color='pointer:161,marker:168,prompt:110,hl+:108' # Seoul256 fzf --color='bg:#4B4B4B,bg+:#3F3F3F,info:#BDBB72,border:#6B6B6B,spinner:#98BC99' \ --color='hl:#719872,fg:#D9D9D9,header:#719872,fg+:#D9D9D9' \ --color='pointer:#E12672,marker:#E17899,prompt:#98BEDE,hl+:#98BC99' # Seoul256 fzf --style full --color=' fg:#616161 fg+:#616161 bg:#ffffff bg+:#e9e9e9 alt-bg:#f1f1f1 hl:#719872 hl+:#719899 pointer:#e12672 marker:#e17899 header:#719872 spinner:#719899 info:#727100 prompt:#0099bd query:#616161 border:#e1e1e1 ' --no-color --no-bold (Bold) --black (DISPLAY MODE) --height=[~][-]HEIGHT[%] fzf . . fzf --height=-1 ~ fzf . ~ . # seq 5 | fzf --height=~100% # seq 5 | fzf --height=~-1 : * (margin) (padding) / * --min-height=HEIGHT[+] --height . + (: 10+ ). --height . --popup[=[center|top|bottom|left|right][,SIZE[%]][,SIZE[%]][,border-native]] fzf tmux Zellij ( center,50% ). tmux 3.3 Zellij 0.44 . fzf tmux Zellij . --tmux . tmux 3.7 Zellij (non- modal) fzf . border-native . --border-label change-border-label transform-border-label ( --border-label-pos ). tmux fzf @fzf-border-label pane-border-format pane-border-status tmux . . Zellij . --border fzf . none line . border-native . tmux fzf tmux tmux 3.7 . : # fzf --popup 70% # fzf --popup right,40% # fzf --popup bottom,30% # fzf --popup top,80%,40% # tmux Zellij fzf --popup center,80%,border-native (LAYOUT) --layout=LAYOUT (: default) default reverse reverse-list --reverse --layout=reverse --margin=MARGIN (Margins) . TRBL TB,RL T,RL,B T,R,B,L % . : fzf --margin 10% fzf --margin 1,5% --padding=PADDING (padding) . (margin) --border . : fzf --margin 5% --padding 5% --border --preview 'cat {}' \ --color bg:#222222,preview-bg:#333333 TRBL TB,RL T,RL,B T,R,B,L --border[=STYLE] rounded () sharp bold double dashed block thinblock horizontal vertical line ( ) top (up) bottom (down) left right none --ambidouble . --no-unicode . line --height . --border-label[=LABEL] . --border : * rounded * sharp * bold * double * horizontal * top (up) * bottom (down) : # ANSI # ( https://github.com/busyloop/lolcat) label=$(curl -s http://metaphorpsum.com/sentences/1 | lolcat -f) # fzf --height=10 --border --border-label=" $label " --color=label:italic:black # ( ) fzf --height=10 --border --border-label=" $label " --border-label-pos=3 --color=label:italic:black # ( ) (:bottom) fzf --height=10 --border --border-label=" $label " --border-label-pos=-3:bottom --color=label:italic:black --border-label-pos[=N[:top|bottom]] . . . :bottom . 0 ( center) . (LIST SECTION) -m, --multi[=MAX] tab/shift-tab. . +m, --no-multi --highlight-line --cycle --wrap[=MODE] . MODE char () word . word ( ) . --wrap-word --wrap=word . --wrap-sign=INDICATOR . --no-unicode ' ' '> ' . --no-multi-line --read0 --raw . --track fzf . fzf . --tac . --id-nth fzf reload . --id-nth . --id-nth --track . : # ( ) git log --oneline --graph --color=always | nl | fzf --ansi --track --no-sort --layout=reverse-list # ( ) kubectl get pods | fzf --track --id-nth 1 --header-lines=1 \ --bind 'ctrl-r:reload:kubectl get pods' --id-nth=N[,..] (cross-reload). fzf reload reload-sync . --track fzf nth . ( ). reload . reload-sync . Escape Ctrl-C fzf . +T* ( +t* ) . --multi reload-sync . : # kubectl get pods | fzf --multi --track --id-nth 1 --header-lines=1 \ --bind 'ctrl-r:reload-sync:kubectl get pods' --tac : history | fzf --tac --no-sort --gap[=N] --gap-line[=STR] (: '' '-' --no-unicode). --freeze-left=N . --freeze-right=N . --keep-right . . --freeze-right=1 . --scroll-off=LINES (: ). --no-hscroll --hscroll-off=COLS (: ). . --jump-labels=CHARS jump --gutter=CHAR (gutter) (: '' --no-unicode ) --gutter-raw=CHAR (: '' --no-unicode ) --pointer=STR (: '' '>' --no-unicode) --marker=STR (: '' '>' --no-unicode) --marker-multi-line=STR (: '' '.|'' --no-unicode). --ellipsis=STR (: '..') --tabstop=SPACES (: ) --scrollbar=CHAR1[CHAR2] (: '|' ':' --no-unicode ). CHAR2 . --no-scrollbar . --scrollbar='' --list-border[=STYLE] . line . --list-label[=LABEL] --list-label-pos[=N[:top|bottom]] (INPUT SECTION) --no-input . . search . show-input toggle-input hide-input toggle-input . --prompt=STR (: '> ') --info=STYLE ( ). default right hidden inline ' < ' inline:PREFIX inline-right inline-right:PREFIX --info-command=COMMAND . . ANSI . $FZF_INFO . ENVIRONMENT VARIABLES EXPORTED TO CHILD PROCESSES . : # fzf --info-command='printf "\x1b[33;1m$FZF_POS\x1b[m/$FZF_INFO "' --no-info --info=hidden --separator=STR (: '' '-' --no-unicode ). ( --input-border --header-border ) . ANSI . --no-separator . --separator='' --ghost=TEXT (ghost text) --filepath-word . : backward-kill-word backward-word forward-word kill-word --input-border[=STYLE] . line . --input-label[=LABEL] --input-label-pos[=N[:top|bottom]] (PREVIEW WINDOW) --preview=COMMAND . {} . ( FIELD INDEX EXPRESSION ). : fzf --preview='head -$LINES {}' ls -l | fzf --preview="echo user={3} when={-4..-2}; cat {-1}" --header-lines=1 fzf $FZF_PREVIEW_LINES $FZF_PREVIEW_COLUMNS . ( $LINES $COLUMNS FZF_PREVIEW_ .) fzf $FZF_PREVIEW_TOP $FZF_PREVIEW_LEFT . + ( ) . : fzf --multi --preview='head -10 {+}' git log --oneline | fzf --multi --preview 'git show {+1}' * . . . r () ( {r} {r1} ). . . s . f . ARG_MAX . : # # ARG_MAX 'f' . seq 100000 | fzf --preview "awk '{sum+=\$1} END {print sum}' {*f}" # {+f} seq 100 | fzf --multi --bind 'enter:become:cat {+f}' : * {q} . * {q} {q:1} {q:2..} . * {n} - . {+n} . . {q} . 0.24.0 fzf . ANSI (CSI 2 J) . : fzf --preview 'for i in $(seq 100000); do (( i % 200 == 0 )) && printf "\033[2J" echo "$i" sleep 0.01 done' fzf Kitty Sixel . https://github.com/junegunn/fzf/blob/master/bin/fzf-preview.sh . : fzf --preview='fzf-preview.sh {}' --preview-border[=STYLE] --preview-window=border-STYLE line . --preview-label[=LABEL] . --preview-window : * border-rounded ( ) * border-sharp ( ) * border-bold * border-double * border-dashed * border-block * border-thinblock * border-horizontal * border-top * border-bottom --preview-wrap-sign=INDICATOR . --wrap-sign . --preview-label-pos[=N[:top|bottom]] . . . :bottom . 0 ( center) . --preview-window=[POSITION][,SIZE[%]][,border-STYLE][,[no]wrap][,wrap-word][,[no]follow][,[no]cycle][,[no]info][,[no]hidden][,+SCROLL[OFFSETS][/DENOM]][,~HEADER_LINES][,default][,: right) up down left right next . * next : --layout=reverse . * :hidden toggle-preview . * 0 fzf . * . wrap . wrap-word . * follow tail -f : fzf --preview-window follow --preview 'for i in $(seq 100000); do echo "$i" sleep 0.01 (( i % 300 == 0 )) && printf "\033[2J" done' * cycle . * noinfo . * --border border- border-rounded ( ) border-sharp ( ) border-left border-none . * border-line . * [:+SCROLL[OFFSETS][/DENOM]] . - SCROLL {n} - . - OFFSETS . (-INTEGER +INTEGER) . - /DENOM . * ~HEADER_LINES N . * default . : # fzf --preview="head {}" --preview-window=up,30% fzf --preview="file {}" --preview-window=down,1 # git grep (-5) git grep --line-number '' | fzf --delimiter : --preview 'nl {1}' --preview-window '+{2}-5' # bat # # ~3 # +{2} # +3 # /2 # git grep --line-number '' | fzf --delimiter : \ --preview 'bat --style=full --color=always --highlight-line {2} {1}' \ --preview-window '~3,+{2}+3/2' # fzf --preview 'bat --style=full --color=always {}' --preview-window '~3' * . . : fzf --preview 'cat {}' --preview-window 'right,border-left,<30(up,30%,border-bottom)' (HEADER) --header=STR (sticky header) . --layout --with-nth . ANSI --ansi . --header-lines=N N . --with-nth . --header-first (prompt). (--header-lines) . --header-border[=STYLE] . line . inline --list-border ( rounded / sharp / bold / double / dashed / block / thinblock / horizontal) line . T horizontal T . --header-first ( ) --header-lines --header-lines-border inline . --header-label[=LABEL] --header-label-pos[=N[:top|bottom]] --header-lines-border[=STYLE] --header-lines . none . --no-header-lines-border . line . inline --list-border line . (FOOTER) --footer=STR (sticky footer) . --layout --with-nth . ANSI --ansi . --footer-border[=STYLE] . line . inline --list-border line . --footer-label[=LABEL] --footer-label-pos[=N[:top|bottom]] (SCRIPTING) -q, --query=STR (query) -1, --select-1 (--query) -0, --exit-0 (--query) -f, --filter=STR (Filter mode). . --no-sort fzf grep . --print-query --expect=KEY[,..] enter fzf . fzf ( --print-query ). fzf enter . --expect fzf . --no-expect . : fzf --expect=ctrl-v,ctrl-t,alt-s --expect=f1,f2,~,@ --bind . print . : fzf --multi \ --bind 'enter:print()+accept,ctrl-y:select-all+print(ctrl-y)+accept' --no-clear . fzf tput rmcup . (flickering) fzf . ( reload .) : foo=$(seq 100 | fzf --no-clear) || ( # tput rmcup exit 1 ) && seq "$foo" 100 | fzf / (KEY/EVENT BINDING) --bind=BINDINGS / . / (KEY/EVENT BINDINGS) . (ADVANCED) --with-shell=STR . (*nix) $SHELL $SHELL -c sh -c . $SHELL cmd /s/c . --listen[=SOCKET_PATH|[ADDR:]PORT] --listen-unsafe[=[ADDR:]PORT] HTTP . POST GET . .sock . - 0 fzf FZF_PORT (export) . - fzf . . FZF_SOCK . - FZF_API_KEY API HTTP x-api-key . - FZF_API_KEY localhost . - --listen-unsafe . : # HTTP 6266 fzf --listen 6266 # curl -XPOST localhost:6266 -d 'reload(seq 100)+change-prompt(hundred> )' # HTTP 6266 # * localhost API export FZF_API_KEY="$(head -c 32 /dev/urandom | base64)" fzf --listen 0.0.0.0:6266 # curl -XPOST localhost:6266 -H "x-api-key: $FZF_API_KEY" -d 'change-query(yo)' # $FZF_PORT fzf --listen --bind 'start:execute-silent:echo $FZF_PORT > /tmp/fzf-port' # JSON () # - GET: # - limit: (: 100) # - offset: (: 0) curl localhost:6266 # .txt fzf --multi --sync --listen --bind 'load:transform: pos=1 curl -s localhost:$FZF_PORT?limit=1000 | jq -r .matches[].text | while read -r text; do if [[ $text =~ \.txt$ ]]; then echo -n "+pos($pos)+select" fi pos=$((pos + 1)) done echo +first TCP : fzf --listen=/tmp/fzf.sock # GET curl --unix-socket /tmp/fzf.sock http # POST curl --unix-socket /tmp/fzf.sock http -d up --threads=N . min(8 * NUM_CPU, 32) . --bench=DURATION --filter . --filter . : cat /usr/share/dict/words | fzf --filter abc --bench 10s (DIRECTORY TRAVERSAL) --walker=[file][,dir][,follow][,hidden] $FZF_DEFAULT_COMMAND . file,follow,hidden . * file : * dir : * hidden : * follow : ( ) --walker-root=DIR [...] . . --walker-skip=DIRS . .git,node_modules . (HISTORY) --history=HISTORY_FILE . CTRL-N CTRL-P next-history prev-history . --history-size=N (: 1000). . : gem list | fzf --with-shell 'ruby -e' --preview 'pp Gem::Specification.find_by_name({1})' (SHELL INTEGRATION) --bash Bash : eval "$(fzf --bash)" --zsh Zsh : source <(fzf --zsh) --fish Fish : fzf --fish | source --nushell Nushell : fzf --nushell | save -f ~/.config/nushell/autoload/_fzf_integration.nu (OTHERS) --no-mouse --no-unicode ASCII (spinner) . --ambidouble ( ) . (HELP) --version --help --man (man page) (ENVIRONMENT VARIABLES) FZF_DEFAULT_COMMAND TTY . (*nix) SHELL fzf $SHELL -c sh -c POSIX . FZF_DEFAULT_OPTS . : export FZF_DEFAULT_OPTS="--layout=reverse --border --cycle" FZF_DEFAULT_OPTS_FILE . : export FZF_DEFAULT_OPTS_FILE=~/.fzfrc FZF_API_KEY API --listen . . DNS (DNS rebinding) . (EXIT STATUS) 0 1 2 126 (Permission denied) become 127 become 130 CTRL-C ESC (FIELD INDEX EXPRESSION) ([BEGIN]..[END]) . --nth --with-nth . (Examples) 1 2 -1 -2 3..5 2.. ..-3 .. (ENVIRONMENT VARIABLES EXPORTED TO CHILD PROCESSES) fzf (export) : FZF_LINES fzf (padding) (margin) FZF_COLUMNS fzf FZF_DIRECTION (up down) FZF_TOTAL_COUNT FZF_MATCH_COUNT FZF_SELECT_COUNT FZF_POS FZF_CURRENT_ITEM ( ) FZF_WRAP (char word) FZF_QUERY FZF_INPUT_STATE (enabled disabled hidden) FZF_NTH --nth FZF_WITH_NTH --with-nth FZF_PROMPT (prompt) FZF_GHOST (ghost) FZF_POINTER (pointer) FZF_PREVIEW_LABEL FZF_BORDER_LABEL FZF_LIST_LABEL FZF_INPUT_LABEL FZF_HEADER_LABEL FZF_ACTION FZF_KEY FZF_IDLE_TIME FZF_IDLE_TIME_MS FZF_PORT --listen FZF_SOCK --listen FZF_PREVIEW_TOP FZF_PREVIEW_LEFT FZF_PREVIEW_LINES FZF_PREVIEW_COLUMNS FZF_RAW (raw) FZF_CURRENT_ITEM NUL exec(2) . . (EXTENDED SEARCH MODE) fzf << >> . : 'wild ^music .mp3$ sbtrkt !rmx ( ) . - (Exact-match) (') << >> ( <<>>) . fzf . (Anchored-match) ^ $ . fzf . . - (Exact-boundary-match) << >> . fzf . (regular expressions) (underscore) . . 1. xxx foo xxx ( ) 2. xxx foo_xxx 3. xxx_foo xxx 4. xxx_foo_xxx ( ) (Negation) ! fzf . fzf . (Exact-match by default) ( ') fzf -e --exact . --exact ' (unquote ). OR (|) OR . core go rb py . : ^core go$ | rb$ | py$ / (KEY/EVENT BINDINGS) --bind . . --bind . KEY:ACTION EVENT:ACTION . : KEY1,KEY2,EVENT1,EVENT2:ACTION. : fzf --bind=ctrl-j:accept,ctrl-k:kill-line # 'ps -ef' CTRL-R fzf --bind 'start,ctrl-r:reload:ps -ef' : () (AVAILABLE KEYS: SYNONYMS) ctrl-[a-z] ctrl-space ctrl-delete ctrl-\ ctrl-] ctrl-^ (ctrl-6) ctrl-/ (ctrl-_) ctrl-alt-[a-z] ( ctrl-alt-h ctrl-alt-backspace ) alt-[*] ( ) f[1-12] enter (return ctrl-m) space backspace (bspace bs) alt-up alt-down alt-left alt-right alt-home alt-end alt-backspace (alt-bspace alt-bs) alt-delete alt-page-up alt-page-down alt-enter alt-space tab shift-tab (btab) esc delete (del) up down left right home end insert page-up (pgup) page-down (pgdn) ctrl-up ctrl-down ctrl-left ctrl-right ctrl-home ctrl-end ctrl-backspace (ctrl-bspace ctrl-bs) ctrl-delete ctrl-page-up ctrl-page-down shift-up shift-down shift-left shift-right shift-home shift-end shift-delete shift-page-up shift-page-down alt-shift-up alt-shift-down alt-shift-left alt-shift-right alt-shift-home alt-shift-end alt-shift-delete alt-shift-page-up alt-shift-page-down ctrl-alt-up ctrl-alt-down ctrl-alt-left ctrl-alt-right ctrl-alt-home ctrl-alt-end ctrl-alt-backspace (ctrl-alt-bspace ctrl-alt-bs) (ctrl-alt-h ( )) ctrl-alt-delete ctrl-alt-page-up ctrl-alt-page-down ctrl-shift-up ctrl-shift-down ctrl-shift-left ctrl-shift-right ctrl-shift-home ctrl-shift-end ctrl-shift-delete ctrl-shift-page-up ctrl-shift-page-down ctrl-alt-shift-up ctrl-alt-shift-down ctrl-alt-shift-left ctrl-alt-shift-right ctrl-alt-shift-home ctrl-alt-shift-end ctrl-alt-shift-delete ctrl-alt-shift-page-up ctrl-alt-shift-page-down left-click right-click double-click scroll-up scroll-down preview-scroll-up preview-scroll-down shift-left-click shift-right-click shift-scroll-up shift-scroll-down ctrl-* . (AVAILABLE EVENTS): start fzf . fzf --sync . : # seq 1000 | fzf --multi --sync --bind start:last+select-all load . : # "loaded" (seq 10; sleep 1; seq 11 20) | fzf --prompt 'Loading> ' --bind 'load:change-prompt:Loaded> ' resize . : fzf --bind 'resize:transform-header:echo Resized: ${FZF_COLUMNS}x${FZF_LINES}' result ( ) . : # # * 'change' fzf --sync --bind 'result:transform:[[ -z {q} ]] && echo "pos(2)"' result-final result . () . : # 'result' ( ) # 'result-final' ( ) (seq 100; sleep 1; seq 100) | fzf --query 1 \ --bind 'result:transform-header(echo result: $FZF_MATCH_COUNT),result-final:transform-footer(echo final: $FZF_MATCH_COUNT)' change . : # fzf --bind change:first focus . : fzf --bind 'focus:transform-preview-label:echo [ {} ]' --preview 'cat {}' # # lolcat fzf # fzf --bind 'focus:transform-preview-label:echo [ {} ] | lolcat -f' --preview 'cat {}' # seq 10 | fzf --bind 'focus:up' --cycle multi . one . one:accept --select-1 --select-1 one . : # seq 10 | fzf --bind one:accept zero . zero:abort --exit-0 --exit-0 zero . : # echo $RANDOM | fzf --bind 'zero:reload(echo $RANDOM)+clear-query' --height 3 backward-eof . : fzf --bind backward-eof:abort jump jump . : fzf --bind space:jump,jump:accept jump-cancel jump . : fzf --bind space:jump,jump:accept,jump-cancel:abort click-header (header) . FZF_CLICK_HEADER_LINE FZF_CLICK_HEADER_COLUMN . FZF_CLICK_HEADER_WORD FZF_CLICK_HEADER_NTH . : # ps -ef | fzf --style full --layout reverse --header-lines 1 \ --header-lines-border bottom --no-list-border \ --color fg:dim,nth:regular \ --bind 'click-header:transform-nth( echo $FZF_CLICK_HEADER_NTH )+transform-prompt( echo "$FZF_CLICK_HEADER_WORD> " )' click-footer (footer) . FZF_CLICK_FOOTER_LINE FZF_CLICK_FOOTER_COLUMN . FZF_CLICK_FOOTER_WORD . every(N) N (N / 0.5). 0.01 . FZF_IDLE_TIME ( ) FZF_IDLE_TIME_MS () (idle) . : # . # --track --id-nth 2 PID . fzf --header-lines 1 --track --id-nth 2 \ --bind 'start,every(2):reload-sync:ps -ef' # . fzf --bind 'every(1):bg-transform: if [[ $FZF_IDLE_TIME -lt 5 ]]; then echo change-footer: elif [[ $FZF_IDLE_TIME -lt 10 ]]; then echo "change-footer:auto-accept in $((10 - FZF_IDLE_TIME))s" else echo accept fi' (AVAILABLE ACTIONS): . ACTION: DEFAULT BINDINGS (NOTES): abort ctrl-c ctrl-g ctrl-q esc accept enter double-click accept-non-empty ( accept fzf ) accept-or-print-query ( accept ) backward-char ctrl-b left backward-delete-char ctrl-h ctrl-bspace bspace backward-delete-char/eof ( backward-delete-char fzf ) backward-kill-subword backward-kill-word alt-bs backward-subword backward-word alt-b shift-left alt-left become(...) ( fzf ) beginning-of-line ctrl-a home bell ( ) best ( first ) bg-cancel ( ) cancel ( fzf) change-border-label(...) ( --border-label ) change-ghost(...) ( ) change-header(...) ( --header-lines ) change-header-lines(N) ( --header-lines) change-header-label(...) ( --header-label ) change-input-label(...) ( --input-label ) change-list-label(...) ( --list-label ) change-multi ( ) change-multi(...) ( 0) change-nth(...) ( --nth '|') change-with-nth(...) ( --with-nth '|') change-pointer(...) ( --pointer) change-preview(...) ( --preview) change-preview-label(...) ( --preview-label ) change-preview-window(...) ( --preview-window '|') change-prompt(...) ( ) change-query(...) ( ) clear-screen ctrl-l clear-multi ( ) close ( fzf) clear-query ( ) delete-char del delete-char/eof ctrl-d ( delete-char fzf ) deselect deselect-all ( clear-multi ) disable-raw ( ) disable-search ( ) down ctrl-j down down-match ctrl-n alt-down ( ) down-selected ( ) enable-raw ( ) enable-search ( ) end-of-line ctrl-e end exclude ( ) exclude-multi ( ) execute(...) ( ) execute-silent(...) ( ) first ( pos(1)) forward-char ctrl-f right forward-subword forward-word alt-f shift-right alt-right ignore jump ( EasyMotion) kill-line kill-subword kill-word alt-d last ( pos(-1)) next-history (ctrl-n --history) next-selected ( down-selected) page-down pgdn page-up pgup half-page-down half-page-up hide-header hide-input hide-preview offset-down ( CTRL-E Vim) offset-up ( CTRL-Y Vim) offset-middle ( ) pos(...) ( ) prev-history (ctrl-p --history) prev-selected ( up-selected) preview(...) ( ) preview-down shift-down preview-up shift-up preview-page-down preview-page-up preview-half-page-down preview-half-page-up preview-bottom preview-top print(...) ( ) put ( ) put(...) ( ) refresh-preview rebind(...) ( unbind) reload(...) ( ) reload-sync(...) ( ) replace-query ( ) search(...) ( fzf ) select select-all ( ) show-header show-input show-preview toggle (right-click) toggle-all ( ) toggle-in (--layout=reverse* ? toggle+up : toggle+down) toggle-out (--layout=reverse* ? toggle+down : toggle+up) toggle-bind toggle-header toggle-hscroll toggle-input toggle-multi-line toggle-preview toggle-preview-wrap toggle-preview-wrap-word toggle-raw ( ) toggle-search ( ) toggle-sort toggle-track ( (--track)) toggle-track-current ( ) toggle-wrap toggle-wrap-word ctrl-/ alt-/ toggle+down ctrl-i (tab) toggle+up btab (shift-tab) track-current ( ) transform(...) ( ) transform-border-label(...) ( ) transform-ghost(...) ( ) transform-header(...) ( ) transform-header-lines(...) ( --header-lines ) transform-header-label(...) ( ) transform-input-label(...) ( ) transform-list-label(...) ( ) transform-nth(...) ( nth ) transform-with-nth(...) ( with-nth ) transform-pointer(...) ( ) transform-preview-label(...) ( ) transform-prompt(...) ( ) transform-query(...) ( ) transform-search(...) ( fzf ) trigger(...) ( ) unbind(...) ( ) unix-line-discard ctrl-u unix-word-rubout ctrl-w untrack-current ( ) wait ( ) up ctrl-k up up-match ctrl-p alt-up ( ) up-selected ( ) yank ctrl-y transform* bg-transform* . (ACTION COMPOSITION) + . : fzf --multi --bind 'ctrl-a:select-all+accept' fzf --multi --bind 'ctrl-a:select-all' --bind 'ctrl-a:+accept' fzf accept abort . (ACTION ARGUMENT) (...) . : fzf --bind 'ctrl-a:change-prompt(NewPrompt> )' fzf --bind 'ctrl-v:preview(cat {})' --preview-window hidden fzf . : action-name[...] action-name{...} action-name<...> action-name~...~ action-name!...! action-name@...@ action-name#...# action-name$...$ action-name%...% action-name^...^ action-name&...& action-name*...* action-name;...; action-name/.../ action-name|...| action-name:... . - . (COMMAND EXECUTION) execute(...) fzf . enter less fzf : fzf --bind "enter:execute(less {})" --preview . fzf . execute-silent . fzf . ( & ). *nix fzf SHELL $SHELL -c sh -c POSIX . become(...) execute(...) execve(2) fzf . fzf --bind "enter:become(vim {})" (RELOAD INPUT) reload(...) fzf . execute(...) . https://github.com/junegunn/fzf/issues/1750 . : # CTRL-R ps -ef | fzf --bind 'ctrl-r:reload(ps -ef)' --header 'Press CTRL-R to reload' \ --header-lines=1 --layout=reverse # ripgrep RG_PREFIX="rg --column --line-number --no-heading --color=always --smart-case " INITIAL_QUERY="foobar" FZF_DEFAULT_COMMAND="$RG_PREFIX '$INITIAL_QUERY'" \ fzf --bind "change:reload:$RG_PREFIX {q} || true" \ --ansi --disabled --query "$INITIAL_QUERY" reload-sync(...) reload . fzf . : # seq 100 | fzf --bind 'load:reload-sync(sleep 3; seq 1000)+unbind(load)' (TRANSFORM ACTIONS) transform- fzf . . : fzf --bind 'focus:transform-header:file --brief {}' transform(...) . (payload) HTTP POST --listen . : # printf "1. Hello\n2. Goodbye\n\n3. Exit" | fzf --height '~100%' --reverse --header 'Select one' \ --bind 'enter:transform:[[ -n {} ]] && echo accept || echo "change-header:Invalid selection"' transform fzf . {} fzf (single- quoted) . (double- quote) . fzf --bind 'focus:transform:[[ $FZF_ACTION =~ up ]] && echo "change-header()+transform-footer:echo \{}" || echo "change-footer()+transform-header:echo \{}"' (TRANSFORM IN THE BACKGROUND) fzf . transform* bg-transform* . bg . bg-cancel . (WAITING FOR SEARCH COMPLETION) wait . best first . : fzf --bind 'start:change-query(foo)+wait+best' change-query(foo) wait best . start:wait . abort cancel ( ctrl-c ctrl-g ctrl-q esc) . esc:cancel+first . bg-transform-* . wait : bg-transform-query(...)+wait wait . wait transform-query(...) . fzf (..) . (debounced) . ( --listen) wait . wait . (PREVIEW BINDING) preview(...) --preview . : # fzf --preview 'file {}' --bind '?:preview:cat {}' # # ( ) fzf --bind '?:preview:cat {}' # '?' fzf --bind '?:preview:cat {}' --preview-window hidden (CHANGE PREVIEW WINDOW ATTRIBUTES) change-preview-window . --preview-window '|' . : # CTRL-/ fzf --preview 'cat {}' --bind 'ctrl-/:change-preview-window(right,70%|down,40%,border-horizontal|hidden|right)' # `--preview-window` fzf --preview 'cat {}' --preview-window 'right,40%,border-left' --bind 'ctrl-/:change-preview-window(70%|down,border-top|hidden|)' # toggle-preview fzf --preview 'cat {}' --bind 'ctrl-/:change-preview-window(hidden|)' (AUTHORS) Junegunn Choi (junegunn.c@gmail.com) (SEE ALSO) : https://github.com/junegunn/fzf Vim: https://github.com/junegunn/fzf.vim (LICENSE) MIT fzf 0.74.3 Aug 2026 fzf(1)