在MS Windows上使用Emacs的“M-x术语”:错误产生子进程:参数无效

时间:2013-11-28 10:03:58

标签: bash shell emacs terminal term

每当我尝试从我的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来获得更多功能......

任何帮助?

4 个答案:

答案 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

更新:termansi-termmulti-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命令,使用的可执行文件是具有非零值的以下第一项:

  • lisp变量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路径是否允许),您可能会很幸运。