Hier ist eine Skizze einer Implementierung.
Im Archivierungsmodus werden Zuordnungen von Archivtypen zu Befehlen gespeichert, mit denen Daten in Variablen extrahiert werden archive-TYPE-extract
. wir können die richtige Variable finden mit (archive-name "extract")
.
Alle Befehle sind auf das Extrahieren auf Standard-Out zugeschnitten. stdout
Zum Glück können wir sie weiterhin verwenden, wenn wir zu einer Datei unserer Wahl umleiten .
(defun archive-extract-to-file (archive-name item-name command dir)
"Extract ITEM-NAME from ARCHIVE-NAME using COMMAND. Save to
DIR."
(unwind-protect
;; remove the leading / from the file name to force
;; expand-file-name to interpret its path as relative to dir
(let* ((file-name (if (string-match "\\`/" item-name)
(substring item-name 1)
item-name))
(output-file (expand-file-name file-name dir))
(output-dir (file-name-directory output-file)))
;; create the output directory (and its parents) if it does
;; not exist yet
(unless (file-directory-p output-dir)
(make-directory output-dir t))
;; execute COMMAND, redirecting output to output-file
(apply #'call-process
(car command) ;program
nil ;infile
`(:file ,output-file) ;destination
nil ;display
(append (cdr command) (list archive-name item-name))))
;; FIXME: add unwind forms
nil))
Ich habe geändert archive-extract-by-file
, um dies zu bekommen.
(defun archive-extract-marked-to-file (output-dir)
"Extract marked archive items to OUTPUT-DIR."
(interactive "sOutput directory: ")
(let ((command (symbol-value (archive-name "extract")))
(archive (buffer-file-name))
(items (archive-get-marked ?* t))) ; get marked items; t means
; get item under point if
; nothing is marked
(mapc
(lambda (item)
(archive-extract-to-file archive
(aref item 0) ; get the name from the descriptor
command output-dir))
items)))
Hier verwende ich mapc
, um alle markierten Dateien zu durchlaufen und sie zu extrahieren.
Jetzt müssen wir nur noch eine Schlüsselbindung hinzufügen:
(require 'arc-mode)
(define-key archive-mode-map "F" #'archive-extract-marked-to-file)
Ich habe dies an einer Dummy- .zip
Datei getestet, die ein Unterverzeichnis enthält, aber Ihr Kilometerstand kann variieren.
Beachten Sie, dass archive-mode
Träger Arc
, Lzh
, Zip
, Zoo
, Rar
, und 7z
. Es ist nicht unterstützen .tgz
, .tbz
, .tar.gz
und Freunde, die geöffnet werden , mit tar-mode
und uncompress.el
.
foo/bar.txt
In einem Archiv wird nach extrahiertoutput-dir/foo/bar.txt
, nicht nachoutput-dir/bar.txt
. Letzteres ist natürlich möglich, würde aber etwas mehr Code erfordern.