2013-11-28 3 views
8

wenn ich versuche, Mx Begriff von meiner Windows-Distribution von GNU Emacs zu starten, erhalte ich die Fehlermeldung:`Mx Begriff‘ mit Emacs auf MS Windows: Fehler Laichen Kind-Prozess: ungültiges Argument

apply: Spawning child process: invalid argument 

nach der Annahme Standardprogramm zum Ausführen (entweder "bash.exe" oder "zsh.exe", von Cygwin, und in meiner Windows PATH-Umgebungsvariablen vorhanden).

M-x Shell funktioniert mit Zsh/Bash von Cygwin. Aber ich möchte Term verwenden, um weitere Funktionen zu erhalten ...

Irgendwelche Hilfe?

+0

Betrachten Sie eshell. Ich höre, dass es besser ist als portierte Bash unter Windows. –

Antwort

6

Aus meiner Erfahrung wird keiner der Terminal-Emulatoren in Emacs (Begriff, Ansi-Term, Multi-Term) unter Windows unterstützt. Es sieht so aus, als ob der Hauptgrund ist, dass alle auf Low-Level-Unterstützung für Terminals (Stty usw.) angewiesen sind, die nicht von Windows bereitgestellt wird. Versuche, Emacs zu zwingen, sagen wir Cygwin bash zu verwenden, indem wir Referenzen auf z.B./bin/sh in term.el hilft auch nicht. Es Mai Arbeit in Cygwin Emacs, aber ich habe es seit langer Zeit nicht mehr verwendet, weil native W32 Emacs ist so viel besser (für mich). Der Shell-Modus funktioniert entweder mit Cygwin bash oder mit Windows cmd (über cmdproxy, das Teil von Emacs install ist). Sie können die Unterstützung für ANSI-Farben, wenn Sie

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

Ich versuchte Eshell viele Male, aber am Ende mit dem Shell-Modus mit bash, weil ich dazu neigen, Rohre zu verwenden und viele Umleitungen. Gibt es bestimmte Anwendungen, die Sie verwenden möchten, die eine vollständige Terminal-Unterstützung benötigen? Zuerst fehlte mir , aber dann fing ich gerade an, M-x proced zu verwenden.

UPDATE: term, ansi-term und multi-termtun Arbeit in Cygwin Emacs.

2

Blick in den Quellcode von term.el, kann ich eine hartcodierte "/ bin/sh" sehen, die verwendet wird, um das Programm zu starten (die, die in Ihrem Pfad existiert). Wenn Sie eine Kopie Ihrer bash.exe an genau diesem Ort und Namen erstellen können (ich bin mir nicht sicher, ob Windows-cygwin-Pfade das erlauben), könnten Sie Glück haben.

+0

Wenn ich das defun "term-exec-1" mit "bash" als String auswerte (was in meinem Windows PATH steht, btw), habe ich die Nachricht nicht mehr, ich gehe weiter, aber nicht weit genug. Siehe http://screencast.com/t/ZS963d3r8. – fniessen

4

Dies ist ein Versuch, eine allgemeinere Antwort über die Nachricht "Kindprozess erstellen: ungültiges Argument" aufzunehmen, die Emacs in verschiedenen Situationen erzeugt. Ich benutze Emacs 25.0.50.1 auf Windows 7, aber ich habe dies schon früher mit früheren Versionen untersucht und ich denke nicht, dass sich irgendetwas Relevantes geändert hat. Aus irgendeinem Grund startet dieser Fehler den Debugger nicht, selbst wenn debug-on-error festgelegt ist. Es scheint jedoch, dass der Fehler immer von der Funktion start-process in subr.el (im oberen Lisp-Verzeichnis) generiert wird. Sie können daher M-x debug-on-entry RET start-process RET eingeben und dann alles tun, was den Fehler verursacht hat. Emacs zeigt dann einen Backtrace-Puffer an, dessen zweite Zeile die an start-process übergebenen Argumente anzeigt. Das letzte Argument soll der Name einer ausführbaren Datei sein. In allen Fällen, in denen ich den Fehler "Fehlerhafter untergeordneter Prozess: ungültiges Argument" gesehen habe, war die ausführbare Datei nicht vorhanden. Sie müssen dann herausfinden, woher emacs den Dateinamen hat und wie Sie ihn ändern können. Sie können einige Hinweise vom Rest des Backtrace-Puffers erhalten.

Im Falle des M-x term Befehl verwendet die ausführbare Datei ist die erste der folgenden Dinge, die einen Nicht-Null-Wert hat:

  • Die Lisp Variable explicit-shell-file-name (die Sie anpassen können C-h v RET explicit-shell-file-name RET nach der Eingabe)
  • Die Umgebungsvariable ESHELL
  • Die Umgebungsvariable SHELL
  • fest einprogrammierte Wert /bin/sh

2

ich versuchte zu laufen M-x term von einem MingW64 Emacs mit einer MSYS2 bash.exe und ich habe den gleichen Fehler (Sie können im oberen Lisp-Verzeichnis. Sehen dies in term.el auf dem Code, indem Sie) wie du hast. Ferner ist es möglich, ein wenig zu erhalten, indem term-exec-1 in term.el Wechsel zu lesen:

(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))) 

Sie müssen sich mit dem MSYS2 Shell-Pfad beantworten, die so etwas wie /usr/bin/bash.exe ist und Sie dann ein Terminal erhalten. Das Problem ist, dass das Terminal durcheinander ist. Der stty-Befehl funktioniert nicht und der cr funktioniert nicht. Auch die Emacs-Funktion cd empfängt MSYS2-Pfade wie /c/usr/share/emacs/, die nicht gültig sind. Diese Funktion muss angewiesen werden, diese Pfade in Windows-Pfade umzuwandeln.