 you want to interactive with a project other than the one you're in."
   `(let ((projectile-project-root-cache (make-hash-table :test 'equal))
          projectile-project-name
+         projectile-project-root
          projectile-require-project-root)
      ,@body))
 

the search will be rooted from DIR."
  (unless (file-directory-p dir)
    (error "Directory %S does not exist" dir))
  (let* ((default-directory (file-truename (expand-file-name dir)))
         (projectile-project-root
          (or (projectile-project-root)
              default-directory)))
    (call-interactively
     ;; Intentionally avoid `helm-projectile-find-file', because it runs
     ;; asynchronously, and thus doesn't see the lexical `default-directory'

;; Library

;;;###autoload
(defun doom-project-p (&optional dir)
  "Return t if DIR (defaults to `default-directory') is a valid project."
  (and (doom-project-root dir)
       t))

;;;###autoload
(defun doom-project-root (&optional dir)
  "Return the project root of DIR (defaults to `default-directory').
Returns nil if not in a project."
  (let ((projectile-project-root (unless dir projectile-project-root))
        projectile-require-project-root)
    (projectile-project-root dir)))

;;;###autoload
(defun doom-project-name (&optional dir)
  "Return the name of the current project.

Returns '-' if not in a valid project."
  (if-let* ((project-root (or (doom-project-root dir)
                              (if dir (expand-file-name dir)))))
      (funcall projectile-project-name-function project-root)
    "-"))

;;;###autoload
(defun doom-project-expand (name &optional dir)
  "Expand NAME to project root."
  (expand-file-name name (doom-project-root dir)))

;;;###autoload
(defun doom-project-find-file (dir)
