2013-11-28 13 views
8

每当我试图从GNU Emacs的我的Windows分发推出的Mx来看,我得到的错误:`的Mx术语”使用Emacs在MS Windows:错误产卵子进程:无效的参数

apply: Spawning child process: invalid argument 

接受后运行默认程序(来自Cygwin的“bash.exe”或“zsh.exe”,并出现在我的Windows PATH环境变量中)。

M-x shell可以和Cygwin的Zsh/Bash一起工作。但我想用Term来获得更多功能...

任何帮助?

+0

考虑一下eshell。我听说它比在Windows上移植bash更好。 –

回答

6

根据我的经验,Windows下支持Emacs(term,ansi-term,multi-term)中的任何终端仿真器都不受支持。看起来主要原因是它们都依赖于对Windows不提供的对终端(stty等)的低级支持。尝试强制Emacs使用Cygwin bash,例如编辑对象的引用。/bin/sh在term.el中也没有帮助。它可能工作在Cygwin Emacs,但我没有使用它很长一段时间,因为原生W32 Emacs是好多了(对我来说)。 Shell模式适用于Cygwin bash或Windows cmd(通过作为Emacs安装一部分的cmdproxy)。如果你这样做

(add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on) 

我试过ESHELL很多次,但最终使用使用bash外壳模式,因为我倾向于使用管道和重定向很多,你可以有ANSI色彩支持。是否有任何特定应用需要使用全功能终端支持?起初我错过了top,但后来我开始使用M-x proced

UPDATE:termansi-termmulti-term工作Cygwin中的emacs。

2

查看term.el的源代码,我可以看到一个硬编码“/ bin/sh”,用于启动运行程序(存在于路径中的程序)。如果您可以在该确切的位置和名称中创建您的bash.exe的副本(我不确定Windows cygwin路径是否允许),那么您可能会很幸运。

+0

如果我用“bash”作为字符串(这是在我的Windows PATH中,btw)来评估defun“term-exec-1”,我再也没有这个信息,我走得更远了,但还不够远。请参阅http://screencast.com/t/ZS963d3r8。 – fniessen

4

这是试图记录关于emacs在各种情况下产生的消息“产卵子进程:无效参数”的更一般性答案。我在Windows 7上使用emacs 25.0.50.1,但是我已经在早期版本中考虑过这个问题,我不认为任何相关的内容都会改变。出于某种原因,即使设置了debug-on-error,此错误也不会启动调试器。但是,似乎错误总是由subr.el中的函数start-process(位于顶部lisp目录中)生成。因此,您可以输入M-x debug-on-entry RET start-process RET,然后执行任何导致错误的操作。 Emacs将显示一个回溯缓冲区,其第二行将显示传递给start-process的参数。最后一个参数应该是可执行文件的名称。在我看到“产卵子进程:无效参数”错误的所有情况下,可执行文件实际上并不存在。然后您需要确定emacs从哪里获取文件名以及如何更改它。你可以从backtrace缓冲区的其余部分得到一些线索。

M-x term命令的情况下,所使用的可执行文件是第一以下事情,具有非零值:

  • LISP的可变explicit-shell-file-name(可以进入C-h v RET explicit-shell-file-name RET后定制)
  • 环境变量ESHELL
  • 环境变量SHELL
  • 的硬编码值/bin/sh

(您可以通过在term.el在顶级口齿不清目录看代码看到这一点。)

2

我试图用MSYS2 bash.exe运行从MingW64 emacs的M-x term,我得到了同样的错误如你所知。它可以通过改变term.elterm-exec-1阅读进一步得到一点点:

(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 \"[email protected]\"" 
      term-height term-width) 
     ".." 
     command "-i" switches))) 

你需要用它像/usr/bin/bash.exe,然后你得到一个终端MSYS2 shell路径来回答。问题是终端弄乱了。 stty命令不起作用,cr不起作用。 此外,cd emacs功能接收MSYS2路径,如/c/usr/share/emacs/这是无效的。需要建议此功能将这些路径转换为Windows路径。