From 1a55db2623e9cdb3d55c538a2518178cc6b280f9 Mon Sep 17 00:00:00 2001 From: Lin Sun Date: Sat, 13 Mar 2021 11:47:23 +0800 Subject: [PATCH 1/2] [*dired] new user option 'dired-compress-files-default-suffix' *dired-aux.el: user option 'dired-compress-files-default-suffix' for default suffix for compressing directory. --- etc/NEWS | 6 ++++++ lisp/dired-aux.el | 49 +++++++++++++++++++++++++++++++------------------ 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index fa8784d..e20beee 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -635,6 +635,12 @@ line, and allows truncating them (to preserve space on the mode line) or showing them literally, either instead of, or in addition to, displaying "by name" or "by date" sort order. ++++ +*** New user option 'dired-compress-files-default-suffix'. +This user option controls default suffix for compressing directory. If it's +nil, the ".tar.gz" will be used. Refer the 'dired-compress-files-alist' for +supported suffix list. + --- *** Broken and circular links are shown with the 'dired-broken-symlink' face. diff --git a/lisp/dired-aux.el b/lisp/dired-aux.el index d5f4910..237182e 100644 --- a/lisp/dired-aux.el +++ b/lisp/dired-aux.el @@ -1132,6 +1132,7 @@ dired-compress-file-suffixes ;; Solaris 10 version of tar (obsolete in 2024?). ;; Same thing on AIX 7.1 (obsolete 2023?) and 7.2 (obsolete 2022?). ("\\.tar\\.gz\\'" "" "gzip -dc %i | tar -xf -") + ("\\.tar\\.xz\\'" "" "xz -dc %i | tar -xf -") ("\\.tgz\\'" "" "gzip -dc %i | tar -xf -") ("\\.gz\\'" "" "gunzip") ("\\.lz\\'" "" "lzip -d") @@ -1149,10 +1150,7 @@ dired-compress-file-suffixes ("\\.zst\\'" "" "unzstd --rm") ("\\.7z\\'" "" "7z x -aoa -o%o %i") ;; This item controls naming for compression. - ("\\.tar\\'" ".tgz" nil) - ;; This item controls the compression of directories. Its REGEXP - ;; element should never match any valid file name. - ("\000" ".tar.gz" "tar -cf - %i | gzip -c9 > %o")) + ("\\.tar\\'" ".tgz" nil)) "Control changes in file name suffixes for compression and uncompression. Each element specifies one transformation rule, and has the form: (REGEXP NEW-SUFFIX PROGRAM) @@ -1168,6 +1166,13 @@ dired-compress-file-suffixes Otherwise, the rule is a compression rule, and compression is done with gzip. ARGS are command switches passed to PROGRAM.") +(defcustom dired-compress-files-default-suffix nil + "Default suffix for compressing directory. +If nil, the \".tar.gz\" will be used." + :type 'string + :group 'dired + :version "28.1") + (defvar dired-compress-files-alist '(("\\.tar\\.gz\\'" . "tar -cf - %i | gzip -c9 > %o") ("\\.tar\\.bz2\\'" . "tar -cf - %i | bzip2 -c9 > %o") @@ -1275,20 +1280,28 @@ dired-compress-file ;; Try gzip; if we don't have that, use compress. (condition-case nil (if (file-directory-p file) - (progn - (setq suffix (cdr (assoc "\000" dired-compress-file-suffixes))) - (when suffix - (let ((out-name (concat file (car suffix))) - (default-directory (file-name-directory file))) - (dired-shell-command - (replace-regexp-in-string - "%o" (shell-quote-argument out-name) - (replace-regexp-in-string - "%i" (shell-quote-argument (file-name-nondirectory file)) - (cadr suffix) - nil t) - nil t)) - out-name))) + (let* ((suffix + (or dired-compress-files-default-suffix ".tar.gz")) + (rule (cl-find-if + (lambda (x) (string-match-p (car x) suffix)) + dired-compress-files-alist))) + (if rule + (let ((out-name (concat file suffix)) + (default-directory (file-name-directory file))) + (dired-shell-command + (replace-regexp-in-string + "%o" (shell-quote-argument out-name) + (replace-regexp-in-string + "%i" (shell-quote-argument (file-name-nondirectory file)) + (cdr rule) + nil t) + nil t)) + out-name) + (user-error + "No compression rule found for \ +`dired-compress-files-default-suffix' %s, see `dired-compress-files-alist' for\ + the supported suffixes list." + dired-compress-files-default-suffix))) (let ((out-name (concat file ".gz"))) (and (or (not (file-exists-p out-name)) (y-or-n-p -- 2.7.0