diff --git a/README.md b/README.md index 37bde27..2503dd1 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,7 @@ Counsel-projectile also provides replacements for several standard projectile co - C-c p f `counsel-projectile-find-file`: find a project file, - C-c p d `counsel-projectile-find-dir`: find a project directory, - C-c p b `counsel-projectile-switch-to-buffer`: switch to a project buffer, +- C-c p s s `counsel-projectile-ag`: search project files with ag, - C-c p p `counsel-projectile-switch-project`: switch to another project (see above). If your default action for switching to a project (stored in the variable `projectile-switch-project-action`) is `projectile-find-file` (the default), then `counsel-projectile-on` also replaces it with `counsel-projectile-find-file-or-buffer` (see above). diff --git a/counsel-projectile.el b/counsel-projectile.el index ada2bb4..248e15b 100644 --- a/counsel-projectile.el +++ b/counsel-projectile.el @@ -193,6 +193,34 @@ With a prefix ARG invalidates the cache first." (projectile-maybe-invalidate-cache arg) (counsel-projectile-switch-to-buffer t)) +;;; counsel-projectile-ag + +(defun counsel-projectile-ag (&optional options) + "Ivy version of `projectile-ag'." + (interactive) + (if (projectile-project-p) + (let* ((options + (if current-prefix-arg + (read-string "options: ") + options)) + (ignored + (unless (eq (projectile-project-vcs) 'git) + ;; ag supports git ignore files + (append + (cl-union (projectile-ignored-files-rel) grep-find-ignored-files) + (cl-union (projectile-ignored-directories-rel) grep-find-ignored-directories)))) + (options + (concat options + (mapconcat (lambda (i) + (concat "--ignore " i)) + ignored + " ")))) + (counsel-ag nil + (projectile-project-root) + options + (projectile-prepend-project-name "ag"))) + (user-error "You're not in a project"))) + ;;; counsel-projectile-switch-project ;;;###autoload @@ -248,7 +276,11 @@ With a prefix ARG invokes `projectile-commander' instead of `projectile-switch-p ("e" (lambda (dir) (let ((projectile-switch-project-action 'projectile-run-eshell)) (projectile-switch-project-by-name dir arg))) - "start eshell"))) + "start eshell") + ("a" (lambda (dir) + (let ((projectile-switch-project-action 'counsel-projectile-ag)) + (projectile-switch-project-by-name dir arg))) + "search with ag"))) ;;; counsel-projectile @@ -273,15 +305,15 @@ With a prefix ARG invalidates the cache first." (def-projectile-commander-method ?f "Find file in project." (counsel-projectile-find-file)) - - (def-projectile-commander-method ?b - "Switch to project buffer." - (counsel-projectile-switch-to-buffer)) - (def-projectile-commander-method ?d "Find directory in project." (counsel-projectile-find-dir)) - + (def-projectile-commander-method ?b + "Switch to project buffer." + (counsel-projectile-switch-to-buffer)) + (def-projectile-commander-method ?A + "Search project files with ag." + (counsel-projectile-ag)) (def-projectile-commander-method ?s "Switch project." (counsel-projectile-switch-project))) @@ -295,6 +327,7 @@ With a prefix ARG invalidates the cache first." (define-key projectile-mode-map [remap projectile-find-file] #'counsel-projectile-find-file) (define-key projectile-mode-map [remap projectile-find-dir] #'counsel-projectile-find-dir) (define-key projectile-mode-map [remap projectile-switch-project] #'counsel-projectile-switch-project) + (define-key projectile-mode-map [remap projectile-ag] #'counsel-projectile-ag) (define-key projectile-mode-map [remap projectile-switch-to-buffer] #'counsel-projectile-switch-to-buffer) (counsel-projectile-commander-bindings)) (progn @@ -303,6 +336,7 @@ With a prefix ARG invalidates the cache first." (define-key projectile-mode-map [remap projectile-find-file] nil) (define-key projectile-mode-map [remap projectile-find-dir] nil) (define-key projectile-mode-map [remap projectile-switch-project] nil) + (define-key projectile-mode-map [remap projectile-ag] nil) (define-key projectile-mode-map [remap projectile-switch-to-buffer] nil) (projectile-commander-bindings))))