「アーカイブモード」からハードドライブにファイルを抽出します


7

を使用して、アーカイブ(* .zip、*。gzなど)から個々のファイルマークされたファイルをハードドライブに(バッファーで開かずに)抽出する手段を探していますarchive-mode。(この新しい機能を許可する)そのメジャーモードの提案された変更は非常に高く評価されます。

http://www.gnu.org/software/emacs/manual/html_node/emacs/File-Archives.html

回答:


7

これが実装のスケッチです。

アーカイブモードは、アーカイブタイプから変数内のデータを抽出するために使用されるコマンドへのマップを保存しますarchive-TYPE-extract。を使用して適切な変数を見つけることができます(archive-name "extract")

すべてのコマンドは、標準出力に抽出するように調整されています。幸運なことにstdout、私たちが選択したファイルにリダイレクトした場合でも、それらを使用できます。

(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))

archive-extract-by-fileこれを取得するように変更しました。

(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)))

ここではmapc、マークされたすべてのファイルをループして抽出します。

ここで、キーバインディングを追加するだけです。

(require 'arc-mode)
(define-key archive-mode-map "F" #'archive-extract-marked-to-file)

.zipサブディレクトリを含むダミーファイルでこれをテストしましたが、実際の距離は異なる場合があります。

なお、archive-modeサポートArcLzhZipZooRar、と7z。それはないないサポート.tgz.tbz.tar.gzおよび使用して開かれ、友人、tar-modeそしてuncompress.el


@lawlist:更新された回答をご覧ください。これで、サブディレクトリに含まれているファイルを抽出できるようになります。それはディレクトリ構造を再作成することに注意してください:foo/bar.txtアーカイブではにoutput-dir/foo/bar.txtではなくに抽出されoutput-dir/bar.txtます。もちろん後者も可能ですが、さらにコードが必要になります。
コンスタンティン

それは本当にうれしいです。自信が持てたら、アーカイブモード自体に追加することを検討しますか?
マラバルバ2014年

@マラバーバ:はい、そうします。copyright-clerk@fsf.orgLars Ingebrigtsenからこのメールを受け取った)からの返信を待っています。それまでの間、これをクリーンアップしてGitHubに配置します。
コンスタンティン

この新機能は素晴らしいです!どうもありがとうございました。これは確かにアーカイブモードに素晴らしい追加になるでしょう。お気づきのように、(出力ディレクトリ内の)zip-archiveディレクトリ構造を必ずしも再作成せずに特定の出力ディレクトリをターゲットにする機能は便利です。
現状のまま

このコードをありがとう!一つのことしかし:それが良いのだろう(interactive "G...")、それは、現在のディレクトリを提案します、プラスそれはなどを自動補完し、イドモードと対話します。この方法
wvxvw
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.