diff --git a/emacs.el b/emacs.el index e70d3e2..3028657 100644 --- a/emacs.el +++ b/emacs.el @@ -169,7 +169,6 @@ Otherwize hook it." gited highlight-indentation diminish - fzf fic-mode term-cursor pydoc @@ -206,6 +205,7 @@ Otherwize hook it." pasteboard awk-preview recently + fuzzy-finder ))) (set-variable 'package-selected-packages @@ -1194,7 +1194,7 @@ THEM are function and its args." (window-width)) ))) -(define-key ctl-x-map "f" 'my-fzf-or-find-file) +;; (define-key ctl-x-map "f" 'my-fzf-or-find-file) (defun my-fzf-all-lines () "Fzf all lines." @@ -1204,7 +1204,63 @@ THEM are function and its args." (let ((process-environment (cl-copy-list process-environment))) (setenv "FZF_DEFAULT_COMMAND" "rg -nH --no-heading --hidden --follow --glob '!.git/*' --color=always ^") (fzf))) -(define-key ctl-x-map "S" 'my-fzf-all-lines) +;; (define-key ctl-x-map "S" 'my-fzf-all-lines) + +;; fuzzy-finder + +(set-variable 'fuzzy-finder-default-command + (concat "fzf " + "--ansi " + "--color='bg+:-1' " + "--inline-info " + "--cycle " + "--reverse " + "--prompt=\"[`pwd`]> \" ")) + +(set-variable 'fuzzy-finder-default-input-command + (let ((find (or (executable-find "bfs") ;; Breadth-first find https://github.com/tavianator/bfs + ;; Use gfind if available? + "find")) + (fd (or (executable-find "fdfind") + (executable-find "fd")))) + (if fd + (concat "set -eu; set -o pipefail; " + "echo .; " + "echo ..; " + "command " fd " " + "--follow --hidden --no-ignore " + "--color always " + "2>/dev/null") + (concat "set -eu; set -o pipefail; " + "echo .; " + "echo ..; " + "command " find " -L . " + "-mindepth 1 " + "\\( -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' -o -fstype 'proc' \\) -prune " + "-o -print " + "2> /dev/null " + "| " + "cut -b3-")))) + +(defun my-fuzzy-finder-or-find-file () + "Call `fuzzy-finder' if usable or call `find-file'." + (declare (interactive-only t)) + (interactive) + (if (and (executable-find "fzf") + (fboundp 'fuzzy-finder) + (not (file-remote-p default-directory))) + ;; TODO: Use projectile version + (fuzzy-finder) + (call-interactively 'find-file))) +(define-key ctl-x-map "f" 'my-fuzzy-finder-or-find-file) + +(defun my-fuzzy-finder-ripgrep-lines () + "Fzf all lines." + (interactive) + (unless (executable-find "rg") + (error "rg not found")) + (fuzzy-finder :input-command "rg -nH --no-heading --hidden --follow --glob '!.git/*' --color=always ^")) +(define-key ctl-x-map "S" 'my-fuzzy-finder-ripgrep-lines) ;; recently