If you’re not using projectile, but you would like to be able to perform interactive, search-as-you-type, recursive searches through the current project, this is pretty easy to do if you have counsel and find-file-in-project installed.

(defun cpb/counsel-ag-in-project ()
"Use ffip' and counsel-ag' for quick project-wide text searching."
(interactive)
(let ((project-root (ffip-project-root)))
;; if ffip could not find project-root, it will already have
;; shown an error message. We only have to check for non-nil.
(if project-root
(counsel-ag nil project-root nil
(format "Search in PRJ %s" project-root)))))

(global-set-key (kbd "C-c s") 'cpb/counsel-ag-in-project)


This function, which I have bound to ctrl-c s, finds the project root using find-file-in-project's function for this, and then invokes the handy counsel-ag on its result.