diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el index 218058b195..65f3285705 100644 --- a/lisp/progmodes/project.el +++ b/lisp/progmodes/project.el @@ -753,6 +753,35 @@ project-compile (default-directory (project-root pr))) (compile command comint))) +(defun project--list-buffers (pr) + "Return a list of all buffers in project PR." + (let ((root (project-root pr)) + bufs) + (dolist (buf (buffer-list)) + (when-let* ((path (or (buffer-file-name buf) + (buffer-local-value 'default-directory buf))) + (true (file-truename path))) + (when (file-in-directory-p true root) + (push buf bufs)))) + bufs)) + +(defun project--buffer-file-names (pr) + "Return the buffers in project PR associated with a file." + (mapcar #'buffer-name + (cl-remove-if-not + (lambda (buffer) (buffer-file-name buffer)) + (project--list-buffers pr)))) + +;;;###autoload +(defun project-switch-to-buffer () + "Switch to a buffer in the current project." + (interactive) + (let ((pr (project-current t))) + (switch-to-buffer + (project--completing-read-strict + "Switch to buffer" + (project--buffer-file-names pr))))) + ;;; Project list