Как открыть файл из zip-файла напрямую через командную строку Emacs? - PullRequest
0 голосов
/ 25 января 2019

Мне известно, что Zip-файлы можно открыть в Emacs через Dired, а затем получить доступ к отдельным файлам. Тем не менее, я хотел бы сделать то же самое, но из командной строки. Emacs поддерживает это?

Пример команды, которую я ищу:

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

Редактировать: Хотя текущее принятое решение является каноническим правильным, оно не применимо к моему случаю использования, так как я использую OSX, который не совместим, и в любом случае не может легко установить Emacs 27 , Сейчас я ищу менее каноническое, но более практичное решение (возможно, путем вызова сценария lisp при запуске Emacs) - допустимо иметь обертку вокруг Emacs.

Ответы [ 2 ]

0 голосов
/ 31 июля 2019

Я думаю, что у меня может быть быстрый и грязный способ открыть определенный файл в архиве из старых (V22) emacs, которые поставляются с OSX.

в действии как 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\")"

открытия третьего файла. Он просто загружает код elisp, вставленный выше, из файла jea_open_specific_file_in_zip.el, а затем передает в функцию имя внешнего zip-файла и имя конкретного внутреннего сжатого файла: (jea-open-specific-file-in-zip "./data/test1.zip" "data/README3.md") с необходимыми экранированными значениями. Аргумент -Q - это просто вещь, позволяющая ему не загружать сценарии инициализации (просто чтобы я случайно не использовал локальную для моей машины библиотеку)

0 голосов
/ 25 января 2019

В 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...