From 8bf74036d8d0d1699d05dbc335d5155ee5888805 Mon Sep 17 00:00:00 2001 From: Yuchen Pei Date: Tue, 26 Dec 2023 16:47:17 +1100 Subject: [emacs] Fixing a few things - link-gopher: some formatting - my-org: extend my-org-attach-copy-attached-orgs to fallback to a staging area - my-libgen: better naming just in case --- emacs/.emacs.d/lisp/my/my-org.el | 56 +++++++++++++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 12 deletions(-) (limited to 'emacs/.emacs.d/lisp/my/my-org.el') diff --git a/emacs/.emacs.d/lisp/my/my-org.el b/emacs/.emacs.d/lisp/my/my-org.el index b189b78..00a8a0f 100644 --- a/emacs/.emacs.d/lisp/my/my-org.el +++ b/emacs/.emacs.d/lisp/my/my-org.el @@ -822,22 +822,54 @@ When BLOCK-REGEXP is non-nil, use this regexp to find blocks." my-org-attach-copy-attached-doc-exts "\\|"))) (defun my-org-attach-copy-attached-docs () + "Copy docs to a mount point. + +Use `my-org-attach-copy-attached-targets', which is an list +of (name to-dir staging). Try copying to to-dir. + +On failure, hard link to staging. +On success, also move everything from staging to to-dir." (interactive) - (let* ((name - (completing-read "Copy attached docs to: " - my-org-attach-copy-attached-targets)) - (path (alist-get name my-org-attach-copy-attached-targets - nil nil #'equal))) - (let ((basedir (org-attach-dir))) + (pcase-let* ((name + (completing-read "Copy attached docs to: " + my-org-attach-copy-attached-targets + nil t)) + (`(,to ,staging) (alist-get name my-org-attach-copy-attached-targets + nil nil #'equal))) + (let ((basedir (org-attach-dir)) + (failed nil)) (dolist (attached (org-attach-file-list basedir)) (when (string-match my-org-attach-copy-attached-doc-re attached) - (message "Copying %s to %s (%s)..." attached name path) - (copy-file (file-name-concat basedir attached) + (message "Copying %s to %s (%s)..." attached name to) + (condition-case nil + (copy-file (file-name-concat basedir attached) + (file-name-concat + to + (replace-regexp-in-string ":" "_" attached)) + t) + (error + (message "Hardlinking %s to %s staging area (%s)" + attached name staging) + (setq failed t) + (add-name-to-file + (file-name-concat basedir attached) + (file-name-concat + staging + (replace-regexp-in-string ":" "_" attached)) + t))) + (message "Done!"))) + (unless failed + (dolist (staged + (directory-files staging nil + my-org-attach-copy-attached-doc-re)) + (message "Moving staged %s to %s (%s)..." staged name to) + (copy-file (file-name-concat staging staged) (file-name-concat - path - (replace-regexp-in-string ":" "_" attached))) - (message "Done!"))))) - ) + to + (replace-regexp-in-string ":" "_" staged)) + t) + (delete-file (file-name-concat staging staged)) + (message "Done!")))))) (defun my-org-attach-all-url-plaintext (arg) (interactive "P") -- cgit v1.2.3