From 9cdcfdac36d3264bd9a8282606472d2267ddf1a7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 29 Jul 2024 19:46:42 -0400 Subject: [PATCH] feat(workspaces): add +workspace/delete For deleting saved workspaces (saved with `+workspace/save` or `+workspace-save`). Also binds `SPC TAB D` (for evil users) and `C-c w K` (for non-evil users) to it. Fix: #4399 Close: #7869 Co-authored-by: sriramsk1999 --- modules/config/default/+emacs-bindings.el | 1 + modules/config/default/+evil-bindings.el | 1 + modules/ui/workspaces/autoload/workspaces.el | 35 ++++++++++++++++++++ 3 files changed, 37 insertions(+) diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index 1b0394eea..fd773d704 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -413,6 +413,7 @@ :desc "Create workspace" "c" #'+workspace/new :desc "Create named workspace" "C" #'+workspace/new-named :desc "Delete workspace" "k" #'+workspace/kill + :desc "Delete saved workspace" "K" #'+workspace/delete :desc "Save workspace" "S" #'+workspace/save :desc "Switch to other workspace" "o" #'+workspace/other :desc "Switch to left workspace" "p" #'+workspace/switch-left diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 826ad31d9..c4cca4a19 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -382,6 +382,7 @@ :desc "Save workspace to file" "s" #'+workspace/save :desc "Kill session" "x" #'+workspace/kill-session :desc "Kill this workspace" "d" #'+workspace/kill + :desc "Delete saved workspace" "D" #'+workspace/delete :desc "Rename workspace" "r" #'+workspace/rename :desc "Restore last session" "R" #'+workspace/restore-last-session :desc "Next workspace" "]" #'+workspace/switch-right diff --git a/modules/ui/workspaces/autoload/workspaces.el b/modules/ui/workspaces/autoload/workspaces.el index d83c9d5da..1a182be62 100644 --- a/modules/ui/workspaces/autoload/workspaces.el +++ b/modules/ui/workspaces/autoload/workspaces.el @@ -122,6 +122,24 @@ Returns t on success, nil otherwise." (and (member name (persp-list-persp-names-in-file fname)) t))) +;;;###autoload +(defun +workspace-delete (workspace) + "Delete WORKSPACE from the saved workspaces in `persp-save-dir'. + +Return t if WORKSPACE was successfully deleted. Throws error if WORKSPACE is not +found or wasn't saved with `+workspace-save'." + (let* ((fname (expand-file-name +workspaces-data-file persp-save-dir)) + (workspace-name (if (stringp workspace) workspace (persp-name workspace))) + (workspace-names (persp-list-persp-names-in-file fname)) + (workspace-idx (cl-position workspace-name workspace-names :test #'equal))) + (unless workspace-idx + (error "Couldn't find saved workspace '%s'" workspace-name)) + (doom-file-write + fname (list (cl-remove-if (lambda (ws) (equal workspace-name (nth 1 ws))) + (doom-file-read fname :by 'read) + :count 1))) + (not (member name (persp-list-persp-names-in-file fname))))) + ;;;###autoload (defun +workspace-new (name) "Create a new workspace named NAME. If one already exists, return nil. @@ -267,6 +285,23 @@ workspace to delete." (+workspace-message (format "Deleted '%s' workspace" name) 'success))) ('error (+workspace-error ex t)))) +;;;###autoload +(defun +workspace/delete (name) + "Delete a saved workspace in `persp-save-dir'. + +Can only selete workspaces saved with `+workspace/save' or `+workspace-save'." + (interactive + (list + (completing-read "Delete saved workspace: " + (cl-loop with wsfile = (doom-path persp-save-dir +workspaces-data-file) + for p in (persp-list-persp-names-in-file wsfile) + collect p)))) + (and (condition-case-unless-debug ex + (or (+workspace-delete name) + (+workspace-error (format "Couldn't delete '%s' workspace" name))) + ('error (+workspace-error ex t))) + (+workspace-message (format "Deleted '%s' workspace" name) 'success))) + ;;;###autoload (defun +workspace/kill-session (&optional interactive) "Delete the current session, all workspaces, windows and their buffers."