From 82cf9a13134204b87b7fe01d1cebdf5771d7cebb Mon Sep 17 00:00:00 2001 From: Yuchen Pei Date: Tue, 31 Dec 2024 10:04:11 +1100 Subject: [emacs] various changes * emacs/.emacs.d/init/ycp-basic.el: forgot to read my-copy-file-targets from local config * emacs/.emacs.d/init/ycp-markup.el: Key in nov mode to copy file to devices * emacs/.emacs.d/init/ycp-org.el: Back to use browse-url for http / https org links * emacs/.emacs.d/init/ycp-pdf.el: forgot to read my-pdf-dptrp1-ip from local config * emacs/.emacs.d/init/ycp-web.el: add a handler for mariadb kb links * emacs/.emacs.d/lisp/my/my-emms.el: mp4 can be audio * emacs/.emacs.d/lisp/my/my-mariadb.el: a predicate for browse-url to determine mariadb kb links * emacs/.emacs.d/lisp/my/my-nov.el: add a command to copy current epub to a device * emacs/.emacs.d/lisp/my/my-org.el: ensure leading and trailing empty lines are deleted in org-edit-special; factor out copy file to device with staging to my-utils, fix my-org-edit-special-after argument numbers for one more time (it is 0 with src and 1 with example) * emacs/.emacs.d/lisp/my/my-utils.el: mp4 could be audio; a function to copy files to device with staging, factored from my-org --- emacs/.emacs.d/lisp/my/my-utils.el | 71 +++++++++++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) (limited to 'emacs/.emacs.d/lisp/my/my-utils.el') diff --git a/emacs/.emacs.d/lisp/my/my-utils.el b/emacs/.emacs.d/lisp/my/my-utils.el index bc200c2..3ecd0a9 100644 --- a/emacs/.emacs.d/lisp/my/my-utils.el +++ b/emacs/.emacs.d/lisp/my/my-utils.el @@ -321,7 +321,7 @@ Example: (format-time-string ... (my-time-from-epoch 1698582504))" (defvar my-extension-types '((audio . ("asf" "cue" "flac" "m4a" "m4r" "mid" "mp3" "ogg" "opus" - "wav" "wma" "spc")) + "wav" "wma" "spc" "mp4")) (video . ("avi" "m4v" "mkv" "mp4" "mpg" "ogg" "ogv" "rmvb" "webm" "wmv")))) ;;; files @@ -332,6 +332,75 @@ Example: (format-time-string ... (my-time-from-epoch 1698582504))" (make-symbolic-link newname file ok-if-already-exists) newname) +(defvar my-copy-file-targets nil + "Alist of targets to copy attached to, in the form of (name dest staging)") + +(defun my-copy-buffer-file-with-staging () + (interactive) + (unless (buffer-file-name) (error "buffer-file-name is nil")) + (pcase-let* ((name + (completing-read (format "Copy %s to: " (buffer-file-name)) + my-copy-file-targets + nil t)) + (`(,dest ,staging) (alist-get name my-copy-file-targets + nil nil #'equal))) + (my-copy-file-with-staging + (buffer-file-name) dest staging))) + +(defun my-flush-staging-files (staging dest) + "Flush files from STAGING to DEST." + (dolist (staged (directory-files staging)) + (unless (file-directory-p (file-name-concat staging staged)) + (message "Moving staged %s to %s..." staged dest) + (copy-file (file-name-concat staging staged) + (file-name-concat dest staged) + t) + (delete-file (file-name-concat staging staged))))) + +(defun my-flush-staging-files-x () + (interactive) + (pcase-let* ((name + (completing-read (format "Copy %s to: " (buffer-file-name)) + my-copy-file-targets + nil t)) + (`(,dest ,staging) (alist-get name my-copy-file-targets + nil nil #'equal))) + (my-flush-staging-files staging dest))) + +(defun my-copy-file-with-staging (src dest staging) + "Copy a file SRC to DEST with fallback to hardlinking to STAGING." + (my-copy-files-with-staging (list src) dest staging)) + +(defun my-copy-files-with-staging (src dest staging) + "Copy a list of file SRC to DEST with staging. + +DEST and STAGING should be directories. +On failure, hard link to STAGING. +On success, also move everything from STAGING to DEST." + (cl-assert (listp src)) + (let (failed) + (dolist (file src) + (cond + ((not failed) + (message "Copying %s to %s..." file dest) + (condition-case err + (copy-file + file (file-name-concat dest (file-name-nondirectory file)) t) + (error + (message "Encountered error while copying: %s" + (error-message-string err)) + (message "Hardlinking instead %s to staging area %s" src staging) + (setq failed t) + (add-name-to-file + file (file-name-concat staging (file-name-nondirectory file)) t)))) + (t + (message "Hardlinking %s staging area %s" src staging) + (add-name-to-file + file (file-name-concat staging (file-name-nondirectory file)) t)))) + (unless failed + (my-flush-staging-files staging dest)) + (message "Done!"))) + (defun my-rewrite-url-advice (args) (let ((url (car args))) (setcar args (my-rewrite-url url))) -- cgit v1.2.3