Function: treemacs-do-remove-project-from-workspace

treemacs-do-remove-project-from-workspace is a byte-compiled function defined in treemacs-workspaces.el.

Signature

(treemacs-do-remove-project-from-workspace PROJECT &optional IGNORE-LAST-PROJECT-RESTRICTION ASK-TO-CONFIRM)

Documentation

Remove the given PROJECT from the current workspace.

PROJECT may either be a treemacs-project instance or a string path. In the latter case the project containing the path will be selected.

When IGNORE-LAST-PROJECT-RESTRICTION is non-nil removing the last project will not count as an error. This is meant to be used in non-interactive code, where another project is immediately added afterwards, as leaving the project list empty is generally a bad idea.

Ask the user to confirm the deletion when ASK-TO-CONFIRM is t (it will be when this is called from treemacs-remove-project-from-workspace).

Return values may be as follows:

* If the given path is invalid (is nil or does not exist):
  - the symbol invalid-project
  - a string describing the problem
* If the user cancels the deletion:
  - the symbol user-cancel
* If there is only one project:
  - the symbol cannot-delete-last-project
* If everything went well:
  - the symbol success

Source Code

;; Defined in ~/.emacs.d/elpa/treemacs-20251226.1307/treemacs-workspaces.el
(defun treemacs-do-remove-project-from-workspace
    (project &optional ignore-last-project-restriction ask-to-confirm)
  "Remove the given PROJECT from the current workspace.

PROJECT may either be a `treemacs-project' instance or a string path.  In the
latter case the project containing the path will be selected.

When IGNORE-LAST-PROJECT-RESTRICTION is non-nil removing the last project will
not count as an error.  This is meant to be used in non-interactive code, where
another project is immediately added afterwards, as leaving the project list
empty is generally a bad idea.

Ask the user to confirm the deletion when ASK-TO-CONFIRM is t (it will be when
this is called from `treemacs-remove-project-from-workspace').

Return values may be as follows:

* If the given path is invalid (is nil or does not exist):
  - the symbol `invalid-project'
  - a string describing the problem
* If the user cancels the deletion:
  - the symbol `user-cancel'
* If there is only one project:
  - the symbol `cannot-delete-last-project'
* If everything went well:
  - the symbol `success'"
  (treemacs-block
   (unless ignore-last-project-restriction
     (treemacs-return-if (>= 1 (length (treemacs-workspace->projects (treemacs-current-workspace))))
       'cannot-delete-last-project))
   (treemacs-return-if (null project)
     `(invalid-project "Project is nil"))
   ;; when used from outside treemacs it is much easier to supply a path string than to
   ;; look up the project instance
   (when (stringp project)
     (-let [found-project (treemacs-is-path (treemacs-canonical-path project) :in-workspace)]
       (treemacs-return-if (null found-project)
         `(invalid-project ,(format "Given path '%s' is not in the workspace" project)))
       (setf project found-project)))
   (treemacs-return-if
       (and ask-to-confirm
            (not (yes-or-no-p (format "Remove project %s from the current workspace?"
                                      (propertize (treemacs-project->name project)
                                                  'face 'font-lock-type-face)))))
     'user-cancel)
   (treemacs-run-in-every-buffer
    (treemacs-with-writable-buffer
     (let* ((project-pos (goto-char (treemacs-project->position project)))
            (prev-project-pos (move-marker (make-marker) (treemacs--prev-project-pos)))
            (next-project-pos (move-marker (make-marker) (treemacs--next-project-pos))))
       (when (treemacs-project->is-expanded? project)
         (treemacs--collapse-root-node project-pos t))
       (treemacs--remove-project-from-current-workspace project)
       (treemacs--invalidate-buffer-project-cache)
       (let ((previous-button (previous-button project-pos))
             (next-button (next-button project-pos)))
         (cond
          ;; Previous button exists. Delete from the end of the current line to
          ;; the end of the previous button's line. If the `treemacs--projects-end'
          ;; is at the EOL of the  it will move to EOL of the previous button.
          (previous-button
           (delete-region (treemacs-button-end previous-button) (line-end-position))
           (when next-button (forward-button 1)))
          ;; Previous project does not exist, but a next button exists. Delete from
          ;; BOL to the start of the next buttons line.
          (next-button
           (when (> next-button (treemacs--projects-end))
             ;; The first item after the deletion will be bottom extensions. Project
             ;; end will be at its BOL, making it move upon expand/collapse. Lock the marker.
             (set-marker-insertion-type (treemacs--projects-end) nil))
           (delete-region (line-beginning-position) (progn (goto-char next-button) (forward-line 0) (point))))

          ;; Neither the previous nor the next button exists. Simply delete the
          ;; current line.
          (t
           (delete-region (line-beginning-position) (line-end-position)))))
       (if (equal (point-min) prev-project-pos)
           (goto-char next-project-pos)
         (goto-char prev-project-pos)))
     (treemacs--invalidate-buffer-project-cache)
     (--when-let (treemacs-get-local-window)
       (with-selected-window it
         (recenter)))
     (treemacs--evade-image)
     (hl-line-highlight)))
   (run-hook-with-args 'treemacs-delete-project-functions project)
   (treemacs--persist)
   'success))