An Emacs front-end for fzf.
fzf.el is available on MELPA.
Below is an illustrative use-package configuration of fzf.el showing all
available customizations and their default values.
Note: This package does not set default keybindings.
(use-package fzf
:bind
;; Don't forget to set keybinds!
:config
(setq fzf/args "-x --color bw --print-query --margin=1,0 --no-hscroll"
fzf/executable "fzf"
fzf/git-grep-args "-i --line-number %s"
;; command used for `fzf-grep-*` functions
;; example usage for ripgrep:
;; fzf/grep-command "rg --no-heading -nH"
fzf/grep-command "grep -nrH"
;; If nil, the fzf buffer will appear at the top of the window
fzf/position-bottom t
fzf/window-height 15))fzf.el comes with a number of useful commands:
M-x fzfM-x fzf-directory
M-x fzf-find-fileM-x fzf-find-file-in-dirM-x fzf-recentf
M-x fzf-gitM-x fzf-git-filesM-x fzf-git-grepM-x fzf-hgM-x fzf-projectile
Note:
fzf-grep-*-with-narrowingfunctions launch an interactivefzf/grep-commandinstead of using fuzzy filtering. See the fzf advanced documentation for more details.
M-x fzf-grepM-x fzf-grep-dwimM-x fzf-grep-in-dirM-x fzf-grep-with-narrowingM-x fzf-grep-dwim-with-narrowingM-x fzf-grep-in-dir-with-narrowing
M-x fzf-switch-buffer
fzf.el exposes functions to let you interface with fzf however you'd like:
fzf-with-command (command action &optional directory as-filter initq): Runfzfon the output of a shell command.command: The shell command whose output is passed tofzf.action: A function that handles the result offzf(e.g. open a file, switch to a buffer, etc.). This package ships with two default actions that can handle opening a file and opening a file at a specific line.directory: Directory to executefzfin.as-filter: If non-nil, usecommandas the filter instead offzf's fuzzy filtering. Seefzf-grep-*-with-narrowingfunctions for example usages.initq: Ifas-filteris non-nil,initqwill be used as the value for the--queryoption. Ifas-filteris nil, this does nothing.
fzf-with-entries (entries action &optional directory): run fzf, passing in an elisp list and running the function action with the user's selected results.
Using these functions, it's easy to define your own commands that use fzf:
(defun fzf-example ()
(fzf-with-entries
(list "a" "b" "c")
'print))Or more exciting:
(defun fzf-find-file (&optional directory)
(interactive)
(let ((d (fzf/resolve-directory directory)))
(fzf
(lambda (x)
(let ((f (expand-file-name x d)))
(when (file-exists-p f)
(find-file f))))
d)))GPL3