improve performance of `counsel-projectile'

This commit is contained in:
Eric Danan 2017-09-06 23:05:40 +02:00
parent a754b4b4fd
commit 20557b47a9

View file

@ -67,7 +67,7 @@
(defun counsel-projectile-find-file-action (file) (defun counsel-projectile-find-file-action (file)
"Find FILE and run `projectile-find-file-hook'." "Find FILE and run `projectile-find-file-hook'."
(find-fiqle (projectile-expand-root file)) (find-file (projectile-expand-root file))
(run-hooks 'projectile-find-file-hook)) (run-hooks 'projectile-find-file-hook))
(defun counsel-projectile-find-file-action-other-window (file) (defun counsel-projectile-find-file-action-other-window (file)
@ -437,64 +437,50 @@ Invokes the command referenced by
;;; counsel-projectile ;;; counsel-projectile
(defun counsel-projectile--unvisited-file-list () (defvar counsel-projectile--buffers nil
"Return a list of unvisited files for the current project. "Stores the list of project buffers.")
Like `projectile-current-project-files', but skips any files (defvar counsel-projectile--non-visited-files nil
already being visited by a buffer." "Stores the list of project files that are not currently visited by a buffer.")
(let ((root (projectile-project-root)))
(cl-loop
for name in (projectile-current-project-files)
for file = (expand-file-name name root)
if (not (get-file-buffer file))
collect name)))
(defun counsel-projectile--global-list () (defun counsel-projectile--buffer-file-list ()
"Get a list of project buffers and files." "Get a list of project buffers and files."
(append (append
(mapc (lambda (buffer) (setq counsel-projectile--buffers
(add-text-properties 0 1 '(type buffer) buffer))
(counsel-projectile--buffer-list)) (counsel-projectile--buffer-list))
(mapc (lambda (file) (setq counsel-projectile--non-visited-files
(add-text-properties 0 1 '(type file) file)) (let ((root (projectile-project-root))
(counsel-projectile--unvisited-file-list)))) (files (projectile-current-project-files))
file)
(dolist (buffer counsel-projectile--buffers files)
(when (setq file (buffer-file-name (get-buffer buffer)))
(delete (file-relative-name file root) files)))))))
(defun counsel-projectile--matcher (regexp candidates) (defun counsel-projectile--matcher (regexp candidates)
"Return REGEXP-matching CANDIDATES. "Return REGEXP-matching CANDIDATES.
Relies on `ivy--switch-buffer-matcher` and Relies on `ivy--switch-buffer-matcher' and
`counsel--find-file-matcher'." `counsel--find-file-matcher'."
(let ((buffers (cl-remove-if-not (lambda (name) (append (ivy--switch-buffer-matcher regexp counsel-projectile--buffers)
(eq (get-text-property 0 'type name) 'buffer)) (counsel--find-file-matcher regexp counsel-projectile--non-visited-files)))
candidates))
(files (cl-remove-if-not (lambda (name)
(eq (get-text-property 0 'type name) 'file))
candidates)))
(append (ivy--switch-buffer-matcher regexp buffers)
(counsel--find-file-matcher regexp files))))
(defun counsel-projectile-action (name &optional other-window) (defun counsel-projectile-action (name)
"Switch to buffer or find file named NAME." "Switch to buffer or find file named NAME."
(let ((type (get-text-property 0 'type name))) (if (member name counsel-projectile--buffers)
(cond (counsel-projectile-switch-to-buffer-action name)
((eq type 'file) (counsel-projectile-find-file-action name)))
(counsel-projectile-action-find-file name other-window))
((eq type 'buffer)
(counsel-projectile-action-switch-buffer name other-window)))))
(defun counsel-projectile-action-other-window (name) (defun counsel-projectile-action-other-window (name)
"Switch to buffer or find file named NAME in another window." "Switch to buffer or find file named NAME in another window."
(counsel-projectile-action name t)) (if (member name counsel-projectile--buffers)
(switch-to-buffer-other-window name)
(counsel-projectile-find-file-action-other-window name)))
(defun counsel-projectile-transformer (str) (defun counsel-projectile-transformer (name)
"Fontifies modified, file-visiting buffers. "Fontifies modified, file-visiting buffers as well as non-visited files."
(if (member name counsel-projectile--buffers)
Relies on `ivy-switch-buffer-transformer'." (ivy-switch-buffer-transformer name)
(let ((type (get-text-property 0 'type str))) (propertize name 'face 'ivy-virtual)))
(cond
((eq type 'buffer) (ivy-switch-buffer-transformer str))
((eq type 'file) (propertize str 'face 'ivy-virtual))
(t str))))
;;;###autoload ;;;###autoload
(defun counsel-projectile (&optional arg) (defun counsel-projectile (&optional arg)
@ -506,7 +492,7 @@ With a prefix ARG invalidates the cache first."
(counsel-projectile-switch-project) (counsel-projectile-switch-project)
(projectile-maybe-invalidate-cache arg) (projectile-maybe-invalidate-cache arg)
(ivy-read (projectile-prepend-project-name "Load buffer or file: ") (ivy-read (projectile-prepend-project-name "Load buffer or file: ")
(counsel-projectile--global-list) (counsel-projectile--buffer-file-list)
:matcher #'counsel-projectile--matcher :matcher #'counsel-projectile--matcher
:require-match t :require-match t
:keymap counsel-projectile-map :keymap counsel-projectile-map