improve performance of `counsel-projectile'
This commit is contained in:
parent
a754b4b4fd
commit
20557b47a9
1 changed files with 30 additions and 44 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue