diff options
author | Yuchen Pei <id@ypei.org> | 2024-12-31 10:04:11 +1100 |
---|---|---|
committer | Yuchen Pei <id@ypei.org> | 2024-12-31 10:04:11 +1100 |
commit | 82cf9a13134204b87b7fe01d1cebdf5771d7cebb (patch) | |
tree | 2bda461dbfcdb9656e9d43bc36090f5a82b0901c /emacs/.emacs.d/lisp/my/my-utils.el | |
parent | 0584de27f0fc5039e0198732385e0fdcbe41d924 (diff) |
[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
Diffstat (limited to 'emacs/.emacs.d/lisp/my/my-utils.el')
-rw-r--r-- | emacs/.emacs.d/lisp/my/my-utils.el | 71 |
1 files changed, 70 insertions, 1 deletions
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))) |