org-attach: Possibly delete empty attach directory

* lisp/org-attach.(org-attach-sync): Enable possible deletion of empty
attachment directories.  `org-attach-sync-delete-empty-dir' controls
the action: Never delete, Always delete or Query the user (default).
This commit is contained in:
Marco Wahl 2021-07-09 21:03:44 +02:00
parent 32739e35e3
commit 61e0837325
2 changed files with 29 additions and 4 deletions

View File

@ -188,6 +188,12 @@ it is correctly configured as a Git repository.
See [[msg:875z8njaol.fsf@protesilaos.com][this thread]]. See [[msg:875z8njaol.fsf@protesilaos.com][this thread]].
*** New option ~org-attach-sync-delete-empty-dir~
~org-attach-sync-delete-empty-dir~ controls the deletion of an empty
attachment directory at calls of ~org-attach-sync~. There is
Never delete, Always delete and Query the user (default).
** New features ** New features
*** ~ox-koma-letter.el~ is now part of Org's core *** ~ox-koma-letter.el~ is now part of Org's core

View File

@ -245,6 +245,17 @@ Each entry in this list is a list of three elements:
(function :tag "Command") (function :tag "Command")
(string :tag "Docstring")))) (string :tag "Docstring"))))
(defcustom org-attach-sync-delete-empty-dir 'query
"Determine what to do with an empty attachment directory on sync.
When set to nil, don't touch the directory. When set to `query',
ask the user instead, else remove without asking."
:group 'org-attach
:package-version '(Org . "9.5")
:type '(choice
(const :tag "Never delete" nil)
(const :tag "Always delete" t)
(const :tag "Query the user" query)))
;;;###autoload ;;;###autoload
(defun org-attach () (defun org-attach ()
"The dispatcher for attachment commands. "The dispatcher for attachment commands.
@ -600,14 +611,22 @@ with no prompts."
(defun org-attach-sync () (defun org-attach-sync ()
"Synchronize the current outline node with its attachments. "Synchronize the current outline node with its attachments.
This can be used after files have been added externally." Useful after files have been added/removed externally. Option
`org-attach-sync-delete-empty-dir' controls the behavior for
empty attachment directories."
(interactive) (interactive)
(let ((attach-dir (org-attach-dir))) (let ((attach-dir (org-attach-dir)))
(when attach-dir (if (not attach-dir)
(org-attach-tag 'off)
(run-hook-with-args 'org-attach-after-change-hook attach-dir) (run-hook-with-args 'org-attach-after-change-hook attach-dir)
(let ((files (org-attach-file-list attach-dir))) (let ((files (org-attach-file-list attach-dir)))
(org-attach-tag (not files)))) (org-attach-tag (not files)))
(unless attach-dir (org-attach-tag t)))) (when org-attach-sync-delete-empty-dir
(when (and (directory-empty-p attach-dir)
(if (eq 'query org-attach-sync-delete-empty-dir)
(yes-or-no-p "Attachment directory is empty. Delete?")
t))
(delete-directory attach-dir))))))
(defun org-attach-file-list (dir) (defun org-attach-file-list (dir)
"Return a list of files in the attachment directory. "Return a list of files in the attachment directory.