每当我尝试从我的Windows发行版GNU Emacs启动M-x术语时,我都会收到错误:
apply: Spawning child process: invalid argument
接受默认程序运行(来自Cygwin的“bash.exe”或“zsh.exe”,并出现在我的Windows PATH环境变量中)。
M-x shell适用于Cygwin的Zsh / Bash。但我想使用Term来获得更多功能......
任何帮助?
答案 0 :(得分:9)
根据我的经验,Windows下不支持Emacs中的终端模拟器(术语,术语,多项)。看起来主要原因是它们都依赖于Windows提供的对终端(stty等)的低级支持。试图强迫Emacs使用Cygwin bash编辑对例如term.el中的/ bin / sh也无济于事。 可能在Cygwin Emacs中工作,但我很久没有使用它了,因为原生的W32 Emacs好多了(对我来说)。 Shell模式适用于Cygwin bash或Windows cmd(通过cmdproxy,这是Emacs安装的一部分)。如果你这样做,你可以支持ANSI颜色
(add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)
我尝试了很多次eshell,但最终使用了bash的shell模式,因为我倾向于使用管道和重定向。您是否希望使用需要全功能终端支持的特定应用程序?我一开始不知道top
,但后来我才开始使用M-x proced
。
更新:term
,ansi-term
和multi-term
执行在Cygwin emacs中工作。
答案 1 :(得分:5)
这是尝试记录关于消息的更一般的答案"产生子进程:无效参数",emacs在各种情况下产生。我在Windows 7上使用emacs 25.0.50.1,但我之前使用早期版本对此进行了调查,我认为没有任何相关内容发生变化。出于某种原因,即使设置了debug-on-error
,此错误也不会启动调试器。但是,似乎错误总是由start-process
中的函数subr.el
生成(在顶层lisp目录中)。因此,您可以输入M-x debug-on-entry RET start-process RET
,然后执行导致错误的任何操作。然后,Emacs将显示一个回溯缓冲区,其第二行将显示传递给start-process
的参数。最后一个参数应该是可执行文件的名称。在我看过"产卵子进程的所有情况下:无效的参数"错误,可执行文件实际上并不存在。然后,您需要确定emacs从哪里获取文件名,以及如何更改它。你可以从其他的回溯缓冲区中获得一些线索。
对于M-x term
命令,使用的可执行文件是具有非零值的以下第一项:
explicit-shell-file-name
(您可以在输入C-h v RET explicit-shell-file-name RET
后自定义)ESHELL
SHELL
/bin/sh
(您可以通过查看顶部lisp目录中term.el
中的代码来查看此内容。)
答案 2 :(得分:3)
我尝试使用MSYS2 bash.exe从MingW64 emacs运行M-x term
,我得到了同样的错误。通过将term-exec-1
中的term.el
更改为:
(apply 'start-process name buffer
(getenv "SHELL") "-c"
(format "stty -nl echo rows %d columns %d sane 2>/dev/null;\
if [ $1 = .. ]; then shift; fi; exec \"$@\""
term-height term-width)
".."
command "-i" switches)))
您需要使用类似/usr/bin/bash.exe
的MSYS2 shell路径回答,然后您将获得一个终端。问题是终端搞砸了。 stty命令不起作用而且cr不起作用。
此外,cd
emacs函数接收像/c/usr/share/emacs/
这样无效的MSYS2路径。建议将此函数转换为Windows路径。
答案 3 :(得分:2)
查看term.el的源代码,我可以看到用于启动程序运行的硬编码“/ bin / sh”(路径中存在的程序)。如果您可以在确切的位置和名称中创建bash.exe的副本(我不确定Windows cygwin路径是否允许),您可能会很幸运。