我有一个 org-mode 文档,我想将其转换为打开的文档格式。当我尝试这样做(ctrl
+ c
+ e
+ o
)时,我收到一条错误消息:
创建 OpenDocument 文件所需的可执行“zip”。中止。
我的机器上安装了 p7zip,但我不知道如何告诉 emacs 它在那里。我不确定 org-mode 想要做什么,所以我不确定在 .emacs 中配置什么。
谢谢
我有一个 org-mode 文档,我想将其转换为打开的文档格式。当我尝试这样做(ctrl
+ c
+ e
+ o
)时,我收到一条错误消息:
创建 OpenDocument 文件所需的可执行“zip”。中止。
我的机器上安装了 p7zip,但我不知道如何告诉 emacs 它在那里。我不确定 org-mode 想要做什么,所以我不确定在 .emacs 中配置什么。
谢谢
您的 p7zip 可执行文件必须在 Emacsexec-path
变量中,以便 Emacs 可以找到它。
此外,可执行文件必须称为“zip”,因为它在org-odt-init-outfile
函数中是硬编码的。
因此,请检查exec-path
first 的设置以确保它包含您的 zip 可执行文件的位置。
`M-x customize-variable RET exec-path RET`
您需要 Info-ZIP。见http://lists.gnu.org/archive/html/emacs-orgmode/2011-07/msg00485.html
p7zip 可能与 zip 命令行实用程序不兼容,如果我通过这篇文章: http: //sourceforge.net/projects/sevenzip/forums/forum/45797/topic/1521207 ?message=3786349 。所以,我认为,p7zip 在这里可能不是一个可行的选择。
不需要p7zip
或info-zip
外部程序,Emacsdeps
附带一个 zip 程序:minizip
. (有关详细信息,请参阅安装 Emacs Windows 支持库的最简单方法)
我们需要知道的一些情况:
minizip
不支持递归压缩zip
已经被硬编码在ox-odt.el
minizip
的选项与 `zip' 不兼容所以我生成了一个zip.bat
批处理,然后添加到(对于 org 导出到 odt)和(对于 zip 文件,)elisp
的路径zip.bat
%PATH%
exec-path
dired-do-compress-to
zip.bat
:
@echo off
REM zip.bat for minizip on Windows
REM generated by More Reasonable Emacs https://github.com/junjiemars/.emacs.d
setlocal EnableDelayedExpansion
set _OPT=%*
set _ZIP=
set _ARGV=
REM parsing command line arguments
:getopt
if "%1"=="-mX0" set _OPT=%_OPT:-mX0=-0% & shift & goto :getopt
REM ignore options
if "%1"=="-r" set _OPT=%_OPT:-r=% & shift & goto :getopt
if "%1"=="--filesync" set _OPT=%_OPT:--filesync=% & shift & goto :getopt
if "%1"=="-rmTq" set _OPT=%_OPT:-rmTq=% & shift & goto :getopt
REM extract zip and argv
if not "%1"=="" (
if "%_ZIP%"=="" (
if "%_ARGV%"=="" (
set _ZIP=%1
)
) else (
set _ARGV=%_ARGV% %1
)
set _OPT=!_OPT:%1=!
shift
goto :getopt
)
REM minizip recursive call
call :loop %_ARGV%
goto :end
:zip
set _file=%1
set _file=%_file:./=%
if not "%_file%"=="%_ZIP%" (
if exist %_ZIP% (
minizip %_OPT% -a %_ZIP% %_file%
) else (
minizip %_OPT% %_ZIP% %_file%
)
)
goto :end
:loop
for %%i in (%*) do (
if exist "%%i/*" (
for %%f in (%%i/*) do (
call :loop %%i/%%f
)
for /d %%d in (%%i/*) do (
call :loop %%i/%%d
)
) else (
call :zip %%i
)
)
:end
make-zip-bat
生成的函数zip.bat
:
(defun make-zip-bat (zip &rest ignore)
"Make ZIP.bat in `exec-path' for minizip or 7za."
(declare (indent 1))
(when (stringp zip)
(save-str-to-file
(concat "@echo off\n"
(format "REM zip.bat for %s on Windows\n" zip)
"REM generated by More Reasonable Emacs https://github.com/junjiemars/.emacs.d\n\n"
(concat "REM local variable declaration\n\n"
"setlocal EnableDelayedExpansion\n"
"\n"
"set _OPT=%*\n"
"set _ZIP=\n"
"set _ARGV=\n"
"\n"
"REM parsing command line arguments\n\n"
":getopt\n"
(cond ((string= "minizip" zip)
"if \"%1\"==\"-mX0\" set _OPT=%_OPT:-mX0=-0% & shift & goto :getopt\n")
((string= "7za" zip)
(concat
"if \"%1\"==\"-mX0\" set _OPT=%_OPT:-mX0=-mx0% & shift & goto :getopt\n"
"if \"%1\"==\"-0\" set _OPT=%_OPT:-0=-mx0% & shift & goto :getopt\n"
"if \"%1\"==\"-9\" set _OPT=%_OPT:-9=-mx9% & shift & goto :getopt\n")))
"\n"
"REM ignore options\n"
(let ((options nil))
(dolist (x (cond ((string= "minizip" zip)
(append '("-r" "--filesync" "-rmTq") ignore))
((string= "7za" zip)
(append '("-r" "--filesync" "-rmTq"))))
options)
(setq options
(concat options
(format "if \"%%1\"==\"%s\" set _OPT=%%_OPT:%s=%% & shift & goto :getopt\n" x x)))))
"\n"
"REM extract zip and argv\n"
"if not \"%1\"==\"\" (\n"
" if \"%_ZIP%\"==\"\" (\n"
" if \"%_ARGV%\"==\"\" (\n"
" set _ZIP=%1\n"
" )\n"
" ) else (\n"
" set _ARGV=%_ARGV% %1\n"
" )\n"
" set _OPT=!_OPT:%1=!\n"
" shift\n"
" goto :getopt\n"
")\n\n")
(cond ((string= "7za" zip)
(concat "REM 7za call\n"
"7za a %_OPT% -tzip -- %_ZIP% %_ARGV%\n"
"if exist %_ZIP% (\n"
" 7za d %_OPT% -tzip -- %_ZIP% %_ZIP%\n"
")\n"))
((string= "minizip" zip)
(concat "REM minizip recursive call\n\n"
"call :loop %_ARGV%\n"
"goto :end\n"
"\n:zip\n"
"set _file=%1\n"
"set _file=%_file:./=%\n"
"if not \"%_file%\"==\"%_ZIP%\" (\n"
" if exist %_ZIP% (\n"
" minizip %_OPT% -a %_ZIP% %_file%\n"
" ) else (\n"
" minizip %_OPT% %_ZIP% %_file%\n"
" )\n"
")\n"
"goto :end\n"
"\n:loop\n"
"for %%i in (%*) do (\n"
" if exist \"%%i/*\" (\n"
" for %%f in (%%i/*) do (\n"
" call :loop %%i/%%f\n"
" )\n"
" for /d %%d in (%%i/*) do (\n"
" call :loop %%i/%%d\n"
" )\n"
" ) else (\n"
" call :zip %%i\n"
" )\n"
")\n"
"\n:end\n"))))
(v-home% ".exec/zip.bat"))))
让zip
工作的简单方法是将 的内容复制zip.bat
到名为的文件zip.bat
中并将该文件放在exec-path
. 查看更多更合理的 Emacs:zip 程序,也make-zip-bat
支持7-Zip
。