One of the things I’ve missed in the Vim to Emacs migration is solid recursive fuzzy file search. I tried bling/fzf.el, and ended up spending the weekend working on it.
Rather than just work with fuzzy file search, I got way too into the possibility of using fzf as a general completion engine. Fzf.el already had a decent way of invoking fzf (spawn a terminal buffer and shell out) but the real potential is in the programmability.
My code/fork exposes fzf by saying given a list and a function, the user can select an item with FZF and it will be passed to the function. It becomes trivial to run your own actions:
; Example
(fzf-with-entries (list "a" "b" "c") 'print)
; Open recent file
(defun fzf-recentf ()
(interactive)
(fzf-with-entries recentf-list
(lambda (f) (when (file-exists-p f) (find-file f))))
)
; Recursive fuzzy file search
; (resolve-directory will use the projectile root if set)
(defun fzf-find-file (&optional directory)
(interactive)
(let ((d (fzf/resolve-directory directory)))
(fzf-base
(lambda (x)
(let ((f (expand-file-name x d)))
(when (file-exists-p f)
(find-file f))))
d)))