如何直接通过Emacs命令行从zip文件中打开文件?

时间:2019-01-25 13:43:00

标签: emacs zip

我知道可以通过Dired在Emacs上打开Zip文件,然后访问单个文件。但是,我想从命令行执行相同的操作。 Emacs支持吗?

我正在寻找的命令类型的示例:

emacs --open-zip foo.zip --open-file README.md

2 个答案:

答案 0 :(得分:4)

在Emacs 27中,有tramp-archive.el。它通过特殊的语法结构(将zip文件视为目录)添加对存档中文件的访问。您的例子是

emacs path/to/foo.zip/README.md

有关详细信息,请参见https://www.gnu.org/software/tramp/#Archive-file-names。除了安装Emacs 27外,您还可以安装最新的Tramp 2.4.1,据说它可以与较早的Emacsen合作。

注意:这仅适用于GNU / Linux系统。

答案 1 :(得分:1)

我认为我可能有一种快速而肮脏的方法,可以从OSX随附的旧(V22)emacs中打开存档中的特定文件。

in action as gif

它不是经过测试或最佳的,只是概念的证明。文件jea_open_specific_file_in_zip.el的内容为:

(defun jea-open-specific-file-in-zip (outer-archive-file-name inner-file-name)
  (progn
    (find-file outer-archive-file-name)
    (while (not (eobp))
      (let ((bounds (bounds-of-thing-at-point 'filename)))
        (if bounds
            (let ((zipped-file-name (buffer-substring-no-properties (car bounds) (cdr bounds))))
              (if (string= zipped-file-name inner-file-name)
                  (archive-extract)))))
      (archive-next-line 1))))

这是一个原始的外壳捕获:

Jamess-MacBook-Pro-3:open_zip_file jamesanderson$ rm ./data/test1.zip 
Jamess-MacBook-Pro-3:open_zip_file jamesanderson$ 
Jamess-MacBook-Pro-3:open_zip_file jamesanderson$ /usr/bin/emacs --version # old emacs that comes with OSX
GNU Emacs 22.1.1
Copyright (C) 2007 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.
Jamess-MacBook-Pro-3:open_zip_file jamesanderson$ 
Jamess-MacBook-Pro-3:open_zip_file jamesanderson$ ll ./data/*.md # some test data
-rw-r--r--  1 jamesanderson  staff    17B 30 Jul 19:31 ./data/README1.md
-rw-r--r--  1 jamesanderson  staff    17B 30 Jul 19:32 ./data/README2.md
-rw-r--r--  1 jamesanderson  staff    19B 30 Jul 19:32 ./data/README3.md
-rw-r--r--  1 jamesanderson  staff    18B 30 Jul 19:32 ./data/README4.md
Jamess-MacBook-Pro-3:open_zip_file jamesanderson$ 
Jamess-MacBook-Pro-3:open_zip_file jamesanderson$ cat ./data/*.md
Hello World One!
Hello World Two!
Hello World Three!
Hello World Four!
Jamess-MacBook-Pro-3:open_zip_file jamesanderson$ 
Jamess-MacBook-Pro-3:open_zip_file jamesanderson$ zip ./data/test1.zip -9 ./data/README1.md ./data/README2.md ./data/README3.md ./data/README4.md
  adding: data/README1.md (stored 0%)
  adding: data/README2.md (stored 0%)
  adding: data/README3.md (stored 0%)
  adding: data/README4.md (stored 0%)
Jamess-MacBook-Pro-3:open_zip_file jamesanderson$ 
Jamess-MacBook-Pro-3:open_zip_file jamesanderson$ ll ./data/
total 40
drwxr-xr-x  7 jamesanderson  staff   224B 30 Jul 22:09 .
drwxr-xr-x  5 jamesanderson  staff   160B 30 Jul 21:52 ..
-rw-r--r--  1 jamesanderson  staff    17B 30 Jul 19:31 README1.md
-rw-r--r--  1 jamesanderson  staff    17B 30 Jul 19:32 README2.md
-rw-r--r--  1 jamesanderson  staff    19B 30 Jul 19:32 README3.md
-rw-r--r--  1 jamesanderson  staff    18B 30 Jul 19:32 README4.md
-rw-r--r--  1 jamesanderson  staff   725B 30 Jul 22:09 test1.zip
Jamess-MacBook-Pro-3:open_zip_file jamesanderson$ 
Jamess-MacBook-Pro-3:open_zip_file jamesanderson$ /usr/bin/emacs -Q --load ./jea_open_specific_file_in_zip.el --eval "(jea-open-specific-file-in-zip \"./data/test1.zip\" \"data/README3.md\")"

打开第三个文件。它只是从文件jea_open_specific_file_in_zip.el加载上面粘贴的elisp代码,然后将外部zip文件名和特定的内部压缩文件名传递给函数(jea-open-specific-file-in-zip "./data/test1.zip" "data/README3.md"),并带有必需的转义符。 -Q arg只是使它不加载初始化脚本(只是为了避免意外使用我的计算机本地的lib)而已。

相关问题