2013-11-28 13 views
8

bất cứ khi nào tôi cố gắng để khởi động hạn Mx từ phân phối Windows của tôi của GNU Emacs, tôi nhận được lỗi:'Mx hạn' với Emacs trên MS Windows: Lỗi quá trình đẻ trứng con: không hợp lệ lập luận

apply: Spawning child process: invalid argument 

sau khi chấp nhận chương trình mặc định để chạy (hoặc "bash.exe" hoặc "zsh.exe", từ Cygwin, và hiện diện trong biến môi trường Windows PATH của tôi).

M-x shell hoạt động với Zsh/Bash từ Cygwin. Nhưng tôi muốn sử dụng Thời hạn để nhận thêm các tính năng ...

Bất kỳ trợ giúp nào?

+0

Cân nhắc eshell. Tôi nghe nói rằng nó tốt hơn so với bash được chuyển trên Windows. –

Trả lời

6

Từ kinh nghiệm của tôi, không có trình mô phỏng đầu cuối nào trong Emacs (thuật ngữ, ansi-term, multi-term) được hỗ trợ trong Windows. Dường như lý do chính là tất cả chúng đều dựa vào sự hỗ trợ mức thấp cho các thiết bị đầu cuối (stty, vv) mà không được Windows cung cấp. Cố gắng buộc Emacs sử dụng, nói, Cygwin bash bằng cách chỉnh sửa các tham chiếu đến ví dụ:/bin/sh trong term.el không giúp được gì. Nó có thể làm việc trong Cygwin Emacs nhưng tôi đã không sử dụng nó trong một thời gian dài bởi vì bản địa W32 Emacs là tốt hơn rất nhiều (đối với tôi). Chế độ Shell hoạt động tốt với Cygwin bash hoặc Windows cmd (thông qua cmdproxy là một phần của cài đặt Emacs). Bạn có thể có hỗ trợ cho màu ANSI nếu bạn làm

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

Tôi đã thử nhiều lần nhưng kết thúc bằng cách sử dụng chế độ shell với bash vì tôi có xu hướng sử dụng đường ống và chuyển hướng rất nhiều. Có bất kỳ ứng dụng cụ thể nào mà bạn muốn sử dụng yêu cầu hỗ trợ thiết bị đầu cuối đầy đủ tính năng không? Lúc đầu tôi đã mất tích top nhưng sau đó tôi mới bắt đầu sử dụng M-x proced.

UPDATE: term, ansi-term, và multi-termlàm làm việc trong emacs Cygwin.

2

Tìm mã nguồn của term.el, tôi có thể thấy hardcoded "/ bin/sh" được sử dụng để khởi chạy chương trình để chạy (chương trình tồn tại trong đường dẫn của bạn). Nếu bạn có thể tạo một bản sao của bash.exe của bạn trong đó vị trí chính xác và tên (Tôi không chắc chắn nếu Windows cygwin đường dẫn cho phép điều đó), bạn có thể nhận được may mắn.

+0

Nếu tôi đánh giá defun "term-exec-1" bằng "bash" làm chuỗi (trong Windows PATH, btw), tôi không còn thông báo nữa, tôi sẽ tiếp tục, nhưng không đủ xa. Xem http://screencast.com/t/ZS963d3r8. – fniessen

4

Đây là một nỗ lực để ghi lại một câu trả lời chung hơn về thông điệp "Sinh đẻ quá trình con: đối số không hợp lệ", mà emacs sản xuất trong các tình huống khác nhau. Tôi đang sử dụng emacs 25.0.50.1 trên Windows 7, nhưng tôi đã xem xét điều này trước với các phiên bản trước và tôi không nghĩ rằng bất cứ điều gì có liên quan đã thay đổi. Vì một số lý do, lỗi này không khởi động trình gỡ lỗi ngay cả khi debug-on-error được đặt. Tuy nhiên, có vẻ như lỗi luôn được tạo bởi hàm start-process trong subr.el (trong thư mục lisp trên cùng). Do đó, bạn có thể nhập M-x debug-on-entry RET start-process RET và sau đó thực hiện bất kỳ điều gì gây ra lỗi. Emacs sau đó sẽ hiển thị một bộ đệm ngược, dòng thứ hai trong đó sẽ hiển thị các đối số được chuyển đến start-process. Đối số cuối cùng được cho là tên của tệp thi hành. Trong mọi trường hợp tôi đã thấy lỗi "quy trình con đẻ trứng: đối số không hợp lệ", tệp thực thi không thực sự tồn tại. Sau đó, bạn cần phải làm việc ra nơi emacs có tên tập tin từ, và làm thế nào để thay đổi nó. Bạn có thể nhận được một số manh mối từ phần còn lại của bộ đệm ngược.

Trong trường hợp lệnh M-x term, các tập tin thực thi sử dụng là người đầu tiên trong những điều sau đây mà có một giá trị không nil:

  • Các lisp biến explicit-shell-file-name (mà bạn có thể tùy chỉnh sau khi nhập C-h v RET explicit-shell-file-name RET)
  • Các biến môi trường ESHELL
  • Các biến môi trường SHELL
  • giá trị hardcoded /bin/sh

(Bạn có thể thấy điều này bằng cách nhìn vào mã trong term.el trong thư mục lisp đầu.)

2

Tôi cố gắng chạy M-x term từ một emacs MingW64 với một bash.exe MSYS2 và tôi đã nhận các lỗi tương tự như bạn có. Nó có thể nhận được một chút chút nữa bằng cách thay đổi term-exec-1 trong term.el đọc:

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

Bạn cần phải trả lời với con đường vỏ MSYS2 mà là một cái gì đó giống như /usr/bin/bash.exe và sau đó bạn sẽ có được một thiết bị đầu cuối. Vấn đề là các thiết bị đầu cuối là sai lầm. Lệnh stty không hoạt động trên nó và cr không hoạt động. Ngoài ra, chức năng emacs cd nhận được đường dẫn MSYS2 như /c/usr/share/emacs/ không hợp lệ. Chức năng này cần được thông báo để chuyển đổi các đường dẫn đó sang đường dẫn Windows.

Các vấn đề liên quan