2010-04-22 25 views
8

Tôi gặp sự cố khi thiết lập Tramp với EmacsW32 và Cygwin. Tôi đã cấu hình emacs để sử dụng Cygwin như vỏ bằng cách sử dụng w32shell. Tôi cũng đặt biến CHỦ MÔI TRƯỜNG vào c:/Cygwin/home/myusernameSử dụng tramp với EmacsW32 và cygwin, có thể?

Vấn đề là kẻ lang thang mà dường như để treo và không kết nối được thực hiện:

"Tramp chờ đợi nhắc nhở cho vỏ mới".

Tôi đã cố gắng bật gỡ lỗi nhưng vẫn chỉ thấy thông báo này. Mong nhận được một số lời khuyên về điều này. Cảm ơn bạn.

+0

Bạn đã thử 'c: \ cygwin' với dấu gạch chéo theo cách khác? – Mica

Trả lời

5

Hãy lưu ý các thông tin liên quan đến Cygwin trên emacs wiki: http://www.emacswiki.org/emacs/TrampMode

tôi không sử dụng EmacsW32, nhưng tôi sử dụng thành công TRAMP qua ssh với Cygwin và NT Emacs.

Tôi chưa bao giờ nhận được TRAMP làm việc mà không có tác nhân ssh (tức là yêu cầu thông tin xác thực) - như bạn thấy, nó chỉ bị treo - nhưng nó hoạt động tốt với một, vì vậy tôi không dành thời gian để giải quyết điều đó. Giả sử bạn cũng vui khi sử dụng tác nhân (và bạn đã tạo khóa và thêm tệp authorized_keys nếu cần), cách tiếp cận phù hợp với tôi là:

  1. Chạy ssh-agent from cygwin.
  2. Khởi chạy NT Emacs qua cygwin (để nó kế thừa các biến môi trường ssh-agent).
  3. Sử dụng 'sshx' làm phương pháp TRAMP (bạn có thể chỉ định nó theo cách thủ công trong mỗi đường dẫn tệp, nhưng tôi khuyên bạn nên đặt nó theo mặc định, với (setq tramp-default-method "sshx")).

Những điểm đều bao phủ tại Wiki, nhưng bạn cũng có thể tự động điều hơi:

Đối với bước 1, hồ sơ bash của tôi tự động khởi động một đại lý ssh nếu ai chưa chạy, hoặc nhắc nhở tôi cho cụm mật khẩu của tôi nếu danh tính của tôi đã hết hạn. (. Xem mã bên dưới)

Đối với bước 2, mục tiêu của shortcut Windows của tôi cho emacs tung ra trông như thế này:

C:\cygwin\bin\bash.exe --login -c "env HOME=\"`cygpath '%APPDATA%'`\" /cygdrive/c/emacs/emacs-23.1/bin/runemacs.exe"

Đối số --login nghĩa hồ sơ bash của tôi được thực hiện, đảm bảo bước 1 đã luôn luôn được chăm sóc trước khi emacs được bắt đầu.

(Thiết HOME là không cần thiết cho TRAMP, nhưng %APPDATA% là mặc định dưới NT Emacs, và điều này ngăn ngừa sự thư mục home Cygwin từ việc ưu tiên, do đó giữ emacs của bạn cấu hình phù hợp cho dù bạn sử dụng phím tắt này để chạy nó .)

Cuối cùng, đây là mã từ cygwin của tôi .bash_profile quản lý tác nhân ssh của tôi. Đó là một chút hacky, nhưng nó làm việc cho tôi.

Lưu ý rằng tôi hết hạn nhận dạng sau 4 giờ (14400 giây). TRAMP có thể treo sau đó xảy ra (như đã đề cập trước đó, tôi không bao giờ có nó để nhắc tôi cho các thông tin), vì vậy hãy nhận thức được vấn đề này. Nhập C-g để ngăn không cho kết nối. Để tiếp tục kết nối, bạn thường có thể khởi động một trình bao Cygwin khác, nhập lại cụm mật khẩu của bạn, và sau đó TRAMP sẽ vui vẻ trở lại. Thỉnh thoảng nó vẫn không phản hồi, nhưng giết chết bộ đệm * tramp * sẽ phân loại nó.Không hết hạn danh tính của bạn nên phá vỡ vấn đề này, tất nhiên, nên có thể chấp nhận được.

SSH_ENV="${HOME}/.ssh/environment" 

# Run ssh-agent, if one is not already running 
function start_agent { 
    echo "Initialising new SSH agent..." 
    /usr/bin/ssh-agent -t 14400 | sed 's/^echo/#echo/' > "${SSH_ENV}" 
    echo succeeded 
    chmod 600 "${SSH_ENV}" 
    . "${SSH_ENV}" >/dev/null 
    /usr/bin/ssh-add; 
} 

# Source SSH settings, if applicable 
if [ -f "${SSH_ENV}" ]; then 
    . "${SSH_ENV}" >/dev/null 
    #ps ${SSH_AGENT_PID} doesn't work under cywgin 
    ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ >/dev/null || { 
     start_agent; 
    } 
    #if our ssh-added identity has expired (see -t option to ssh-agent) 
    #then we need to re-add it 
    if ! /usr/bin/ssh-add -l >/dev/null; then 
     /usr/bin/ssh-add; 
    fi 
else 
    #no ssh-agent running at the moment 
    start_agent; 
fi 
+0

để làm việc với w32 emacs, bạn có thể sử dụng putty và nó là đại lý quản lý quan trọng. Để kết nối, sử dụng 'pscp' làm phương thức tramp. một khi bạn đã thiết lập, tramp hoạt động trơn tru. – vedang

+0

Cảm ơn câu trả lời của bạn. Nó đã khắc phục sự cố cho tôi để sử dụng tác nhân quản lý khóa. Đã đi với giải pháp ssh-agent kể từ khi tôi tìm thấy quản lý chủ chốt một chút cồng kềnh với putty. – grm

7

Như đã lưu ý, tôi đã thay đổi cách tôi sử dụng TRAMP trong Windows.

TRAMP trong Windows đơn giản là quá chậm. Tính năng Control Master của OpenSSH là những gì tôi cần - điều này giúp mở kết nối SSH liên tục, do đó loại bỏ kết nối tốn kém được yêu cầu cho mọi hoạt động TRAMP. Thật không may, Cygwin về cơ bản không có khả năng hỗ trợ Control Master tại thời điểm này:/

Đây là giải pháp hiện tại của tôi không chạy Emacs trong Windows. Thay vào đó, tôi đã cài đặt máy chủ X.Org của Cygwin, và bắt đầu chạy Emacs trên máy ảo GNU/Linux (được lưu trữ trên hộp Windows của tôi), và sử dụng màn hình Cygwin X.

Công trình này thực sự thực sự tốt.

Tôi đang chạy các emac trong chế độ daemon, điều đó có nghĩa là không có vấn đề gì với máy chủ X và nếu tôi cần tắt hộp Windows, tôi có thể lưu trạng thái của VM, khôi phục nó sau đó, và không thực sự mất phiên của tôi (*). (desktop.el cung cấp quản lý phiên khá tốt trong mọi trường hợp, hoặc nếu bạn cần khởi động lại VM, nhưng nếu bạn đang sử dụng, bạn có thể sửa đổi biến số desktop-files-not-to-save để nó không bỏ qua tất cả các bộ đệm TRAMP của bạn tôi chỉ đặt nó là "^$")

Hãy chắc chắn để khởi động máy chủ X Cygwin với startxwin hơn startx (cựu phép cửa sổ máy chủ X xuất hiện như cửa sổ thông thường của windows), và sau đó từ một xterm bạn có thể thực hiện ssh -Y (me)@(linux) -f "emacs --daemon" để khởi động máy chủ ban đầu và ssh -Y (me)@(linux) -f "emacsclient -c" để bắt đầu một ứng dụng khách mới.

Phương thức TRAMP 'scpc' và 'rsyncc' TRAMP sử dụng Tự động điều khiển chính. Tôi vẫn chạy một ssh-agent trên hộp Linux, mặc dù (để tránh sự cần thiết phải xác thực khi mở các shell từ xa từ các emacs, vv). Lệnh 'emacs --daemon' sau đó trở thành một cái gì đó giống như ssh -Y (me)@(linux) -f "source ~/.ssh/agent-environment && emacs --daemon", giả sử rằng bạn đã đạo diễn/sao chép đầu ra ssh-agent vào tệp đó khi bạn chạy nó (tôi không bận tâm với việc định danh thời gian cho cái này). Và cuối cùng, trên lưu ý cuối cùng, nếu bạn đang sử dụng một cơ chế tương tự như tôi đã đề cập ban đầu để quản lý đại lý ssh Cygwin của bạn trong bash_profile, hãy lưu ý điều gì sẽ xảy ra khi bạn khởi động máy chủ X từ Phím tắt Windows khi bạn không có danh tính được xác thực được tải - không có gì cả (cho đến khi bạn nhìn vào trình quản lý tác vụ và xem quy trình ssh-add đang ngồi ở đó). Do đó, tôi khuyên bạn nên luôn sử dụng startxwin từ dòng lệnh để tránh điều này.

chỉnh sửa:
(*) Đó là giả định không tốt. Tôi đã nhận ra rằng khởi động lại máy chủ X thực sự hiện ngăn tôi kết nối lại với daemon emacs sau đó, điều này khá đáng tiếc. Do đó tôi dựa hoàn toàn vào thư viện máy tính để bàn để khôi phục phiên của tôi. Tôi sử dụng auto-save-hook để thường xuyên lưu tệp trên máy tính để bàn của mình để cập nhật. Xem Emacs Wiki cho điều này và các tùy chọn khác để tăng cường tính năng Desktop.

+0

Ngoài ra, giả sử bạn muốn chia sẻ .emacs giữa các hộp Windows và Linux, hãy đảm bảo bạn tích hợp Win32/Cygwin vào bên trong như sau: (khi (eq system-type 'windows-nt) (yêu cầu' my-win32)) – phils

3

Tôi đã từng sử dụng EmacsW32 nhưng có rất nhiều vấn đề như thế này. Tất cả đều biến mất khi tôi chuyển sang Emacs của Cygwin. Có thể nó đã được cài đặt rồi. Chỉ cần nhập thông tin sau tại dấu nhắc bash:

 
XWin -multiwindow & 
export DISPLAY=:0.0 
emacs 

Nó sẽ nhẹ hơn một chút so với máy ảo Linux.

0

Ngày nay Cygwin đi kèm với emacs-w32 để bạn không cần phải khởi động máy chủ X.

Tôi khuyên bạn nên bắt đầu nó bằng cách:

run emacs-w32 
run emacsclient-w32 -a "" %FILE_OR_DIR% 

Bởi vì nó là Cygwin Emacs với Windows GUI chỉ mẹ đẻ nó hoạt động tốt với TRAMP cho sshing để host Linux.

Bạn có thể kiểm tra tập lệnh http://hg.defun.work/utils/file/tip/emacs/e.bat làm công cụ mở tệp nhanh.

CẬP NHẬT Với Windows hiện đại và UAC nó có thể được tốt hơn để chạy Cygwin Emacs như:

cygstart --action=runas run emacs-w32 
Các vấn đề liên quan