diff --git a/modules/ui/workspaces/autoload/workspaces.el b/modules/ui/workspaces/autoload/workspaces.el index faef4507a..ce27cbb2a 100644 --- a/modules/ui/workspaces/autoload/workspaces.el +++ b/modules/ui/workspaces/autoload/workspaces.el @@ -564,8 +564,27 @@ This be hooked to `projectile-after-switch-project-hook'." (or (eq +workspaces-on-switch-project-behavior t) (+workspace--protected-p (safe-persp-name (get-current-persp))) (+workspace-buffer-list))) - (let ((persp (or (+workspace-get pname t) - (+workspace-new pname)))) + (let* ((ws-param '+workspace-project) + (ws (+workspace-get pname t)) + (ws (if (and ws + (ignore-errors + (file-equal-p (persp-parameter ws-param ws) + proot))) + ws + ;; Uniquify the project's name, so we don't clobber a + ;; pre-existing workspace with the same name. + (let* ((parts (nreverse (split-string proot "/" t))) + (pre (cdr parts)) + (post (list (car parts)))) + (while (and pre + (setq ws (+workspace-get (setq pname (string-join post "/")) t)) + (not (ignore-errors + (file-equal-p (persp-parameter ws-param ws) + proot)))) + (push (pop pre) post)) + (unless pre ws)))) + (ws (or ws (+workspace-new pname)))) + (set-persp-parameter ws-param proot ws) (+workspace-switch pname) (with-current-buffer (doom-fallback-buffer) (setq-local default-directory proot)