From 453bda34b7faede371e7a7d66d0e8401bc9249e6 Mon Sep 17 00:00:00 2001 From: Thierry Pouplier Date: Fri, 17 Jul 2026 15:17:55 -0400 Subject: [PATCH] fix: isolate project bookmarks from globals, mu4e maildir format --- doom/.config/doom/README.org | 32 +++++++++++++++++++++++++------- doom/.config/doom/config.el | 32 +++++++++++++++++++++++++------- 2 files changed, 50 insertions(+), 14 deletions(-) diff --git a/doom/.config/doom/README.org b/doom/.config/doom/README.org index 6e8982a..a769688 100644 --- a/doom/.config/doom/README.org +++ b/doom/.config/doom/README.org @@ -2316,8 +2316,8 @@ only injects when the project's context-tag matches current mu4e context." ("Drafts" . ?D) ("Trash" . ?T) ("Archive" . ?A))) - (push (cons (format "[%s] %s" proj-tag (car folder)) - (format "maildir:/%s.%s" (car folder) proj-tag)) + (push (cons (format "maildir:/%s.%s" (car folder) proj-tag) + (cdr folder)) project-bm))) ;; Inject into mu4e-maildir-shortcuts (setq gortium/project-mu4e-bookmarks project-bm) @@ -3572,11 +3572,19 @@ Returns alist ((NAME . URL) ...) where URL is the link target." (nreverse bookmarks)))))) (defun gortium//append-bookmark-to-plan (name url) - "Add a bookmark NAME with URL to the project's .bookmarks file." + "Add a bookmark NAME with URL to the project's .bookmarks file. +Saves only project bookmarks without contaminating global list." (when (projectile-project-p) - (let ((proj-file (expand-file-name ".bookmarks" (projectile-project-root)))) + (let* ((proj-file (expand-file-name ".bookmarks" (projectile-project-root))) + (saved-alist (copy-tree bookmark-alist))) + ;; Save globals first, then load project bookmarks + (bookmark-save) + (when (file-exists-p proj-file) + (bookmark-load proj-file t)) (bookmark-store name `((filename . ,url)) nil) (bookmark-save nil proj-file) + ;; Restore globals + (setq bookmark-alist saved-alist) (message "Bookmark added to .bookmarks")))) (defun gortium//remove-bookmark-from-plan (name) "Remove a bookmark entry from * Bookmarks in the Plan file." @@ -3608,10 +3616,20 @@ Project bookmarks go to .bookmarks file in project root." (name (read-string (format "[%s] Bookmark name: " tag))) (proj-file (expand-file-name ".bookmarks" (projectile-project-root))) - (bm (bookmark-make-record))) - (bookmark-store name (cdr bm) nil) + (saved-alist (copy-tree bookmark-alist)) + (record (bookmark-make-record))) + ;; Save current globals to disk first + (bookmark-save) + ;; Load existing .bookmarks (if any) + (when (file-exists-p proj-file) + (bookmark-load proj-file t)) + ;; Add new bookmark to alist + (bookmark-store name (cdr record) nil) + ;; Write ONLY project bookmarks to .bookmarks (bookmark-save nil proj-file) - (message "Project bookmark saved to .bookmarks")) + ;; Restore global bookmarks + (setq bookmark-alist saved-alist) + (message "Project bookmark \"%s\" saved to .bookmarks" name)) (user-error "Not in a Projectile project")))))) (defun gortium/list-project-bookmarks () diff --git a/doom/.config/doom/config.el b/doom/.config/doom/config.el index 5b8ec38..c865adb 100644 --- a/doom/.config/doom/config.el +++ b/doom/.config/doom/config.el @@ -1470,8 +1470,8 @@ only injects when the project's context-tag matches current mu4e context." ("Drafts" . ?D) ("Trash" . ?T) ("Archive" . ?A))) - (push (cons (format "[%s] %s" proj-tag (car folder)) - (format "maildir:/%s.%s" (car folder) proj-tag)) + (push (cons (format "maildir:/%s.%s" (car folder) proj-tag) + (cdr folder)) project-bm))) ;; Inject into mu4e-maildir-shortcuts (setq gortium/project-mu4e-bookmarks project-bm) @@ -2642,11 +2642,19 @@ Returns alist ((NAME . URL) ...) where URL is the link target." (nreverse bookmarks)))))) (defun gortium//append-bookmark-to-plan (name url) - "Add a bookmark NAME with URL to the project's .bookmarks file." + "Add a bookmark NAME with URL to the project's .bookmarks file. +Saves only project bookmarks without contaminating global list." (when (projectile-project-p) - (let ((proj-file (expand-file-name ".bookmarks" (projectile-project-root)))) + (let* ((proj-file (expand-file-name ".bookmarks" (projectile-project-root))) + (saved-alist (copy-tree bookmark-alist))) + ;; Save globals first, then load project bookmarks + (bookmark-save) + (when (file-exists-p proj-file) + (bookmark-load proj-file t)) (bookmark-store name `((filename . ,url)) nil) (bookmark-save nil proj-file) + ;; Restore globals + (setq bookmark-alist saved-alist) (message "Bookmark added to .bookmarks")))) (defun gortium//remove-bookmark-from-plan (name) "Remove a bookmark entry from * Bookmarks in the Plan file." @@ -2678,10 +2686,20 @@ Project bookmarks go to .bookmarks file in project root." (name (read-string (format "[%s] Bookmark name: " tag))) (proj-file (expand-file-name ".bookmarks" (projectile-project-root))) - (bm (bookmark-make-record))) - (bookmark-store name (cdr bm) nil) + (saved-alist (copy-tree bookmark-alist)) + (record (bookmark-make-record))) + ;; Save current globals to disk first + (bookmark-save) + ;; Load existing .bookmarks (if any) + (when (file-exists-p proj-file) + (bookmark-load proj-file t)) + ;; Add new bookmark to alist + (bookmark-store name (cdr record) nil) + ;; Write ONLY project bookmarks to .bookmarks (bookmark-save nil proj-file) - (message "Project bookmark saved to .bookmarks")) + ;; Restore global bookmarks + (setq bookmark-alist saved-alist) + (message "Project bookmark \"%s\" saved to .bookmarks" name)) (user-error "Not in a Projectile project")))))) (defun gortium/list-project-bookmarks ()