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))))