Function: projectile-switch-project-by-name
projectile-switch-project-by-name is a byte-compiled function defined
in projectile.el.
Signature
(projectile-switch-project-by-name PROJECT-TO-SWITCH &optional ARG)
Documentation
Switch to project by project name PROJECT-TO-SWITCH.
Invokes the command referenced by projectile-switch-project-action on switch.
With a prefix ARG invokes projectile-dispatch instead
of projectile-switch-project-action.
Source Code
;; Defined in ~/.emacs.d/elpa/projectile-20260820.1509/projectile.el
(defun projectile-switch-project-by-name (project-to-switch &optional arg)
"Switch to project by project name PROJECT-TO-SWITCH.
Invokes the command referenced by `projectile-switch-project-action' on switch.
With a prefix ARG invokes `projectile-dispatch' instead
of `projectile-switch-project-action'."
;; let's make sure that the target directory exists and is actually a project
;; we ignore remote folders, as the check breaks for TRAMP unless already connected
(unless (or (file-remote-p project-to-switch) (projectile-project-p project-to-switch))
(projectile-remove-known-project project-to-switch)
(user-error "Directory %s is not a project" project-to-switch))
;; Record the project we're leaving so `projectile-most-recent-project'
;; points at it after the switch (captured before `default-directory' is
;; rebound below).
(let ((previous-project (projectile-project-root))
(action (if arg
'projectile-dispatch
projectile-switch-project-action)))
(run-hooks 'projectile-before-switch-project-hook)
(if (projectile--transient-command-p action)
;; A transient action (e.g. `projectile-dispatch', whether reached
;; via the prefix argument or set as `projectile-switch-project-action'
;; directly) runs its suffix commands *after* this function returns,
;; so a dynamic `default-directory' binding (or the temporary buffer
;; below) would be gone by the time the chosen command runs. Hand off
;; to a helper that keeps PROJECT-TO-SWITCH current for the lifetime of
;; the menu instead.
(projectile--dispatch-in-directory project-to-switch action)
(let* ((default-directory project-to-switch)
(switched-buffer
;; use a temporary buffer to load PROJECT-TO-SWITCH's dir-locals
;; before calling the switch-project action
(with-temp-buffer
(hack-dir-local-variables-non-file-buffer)
;; Normally the project name is determined from the current
;; buffer. However, when we're switching projects, we want to
;; show the name of the project being switched to, rather than
;; the current project, in the minibuffer. This is a simple hack
;; to tell the `projectile-project-name' function to ignore the
;; current buffer and the caching mechanism, and just return the
;; value of the `projectile-project-name' variable.
(let ((projectile-project-name (funcall projectile-project-name-function
project-to-switch)))
(funcall action)
(current-buffer)))))
;; If the action switched buffers then with-temp-buffer will
;; have lost that change, so switch back to the correct buffer.
(when (buffer-live-p switched-buffer)
(switch-to-buffer switched-buffer))))
;; Don't record the project we just came from if it's the same one we
;; switched to. Compare with `file-equal-p' for local paths (handles
;; symlinks/abbreviation), but fall back to a plain string compare when
;; either side is remote, so we don't trigger a TRAMP round-trip (and
;; possible hang) for an unconnected remote project - the very thing the
;; remote skip above guards against.
(when (and previous-project
(not (if (or (file-remote-p previous-project)
(file-remote-p project-to-switch))
(string-equal (file-name-as-directory previous-project)
(file-name-as-directory project-to-switch))
(file-equal-p previous-project project-to-switch))))
(setq projectile-most-recent-project previous-project))
;; The switch action usually visits a file or directory, which already
;; runs the project-changed functions; this covers actions that don't.
;; Resolving the root of an unconnected remote project would trigger a
;; TRAMP connection, so leave remote detection to the next file visit.
(unless (file-remote-p project-to-switch)
(projectile--maybe-run-project-changed-functions
(projectile-project-root project-to-switch)))
(run-hooks 'projectile-after-switch-project-hook)))