Đây là một bản phác thảo của một thực hiện.
Chế độ lưu trữ lưu trữ bản đồ từ các kiểu lưu trữ đến các lệnh được sử dụng để trích xuất dữ liệu theo các biến archive-TYPE-extract
; chúng ta có thể tìm đúng biến bằng cách sử dụng (archive-name "extract")
.
Tất cả các lệnh được thiết kế để trích xuất ra tiêu chuẩn; may mắn thay, chúng ta vẫn có thể sử dụng chúng nếu chúng ta chuyển hướng stdout
đến một tệp mà chúng ta chọn.
(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))
Tôi sửa đổi archive-extract-by-file
để có được điều này.
(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)))
Ở đây tôi sử dụng mapc
để lặp qua tất cả các tệp được đánh dấu và giải nén chúng.
Bây giờ chúng ta chỉ cần thêm một ràng buộc chính:
(require 'arc-mode)
(define-key archive-mode-map "F" #'archive-extract-marked-to-file)
Tôi đã thử nghiệm điều này trên một .zip
tệp giả có chứa thư mục con, nhưng số dặm của bạn có thể thay đổi.
Lưu ý rằng archive-mode
sự ủng hộ Arc
, Lzh
, Zip
, Zoo
, Rar
, và 7z
. Nó không hỗ trợ .tgz
, .tbz
, .tar.gz
và bạn bè, mà được mở ra sử dụng tar-mode
và uncompress.el
.
foo/bar.txt
trong một kho lưu trữ được trích xuấtoutput-dir/foo/bar.txt
, không phảioutput-dir/bar.txt
. Điều thứ hai là có thể, tất nhiên, nhưng sẽ yêu cầu thêm một số mã.