Обратите внимание на информацию о cygwin в вики emacs: http://www.emacswiki.org/emacs/TrampMode
Я не использую EmacsW32, но успешно использую TRAMP поверх ssh с Cygwin и NT Emacs.
У меня никогда не было TRAMP, работающего без ssh-агента (т.е. запрашивающего учетные данные) - как вы заметили, он просто зависает - но с ним он работает нормально, поэтому я не тратил время на попытки решить эту проблему.Предполагая, что вы также счастливы использовать агент (и вы уже сгенерировали свои ключи и добавили, если необходимо, файлы author_keys), подход, который мне подходит:
- Запустите ssh-agent из cygwin.
- Запустите NT Emacs через cygwin (чтобы он наследовал переменные среды ssh-agent).
- Используйте 'sshx' в качестве метода TRAMP (вы можете указать его вручную в каждом пути к файлу, ноЯ рекомендую установить его по умолчанию, используя
(setq tramp-default-method "sshx")
).
Все эти моменты рассматриваются в вики, но вы также можете несколько автоматизировать некоторые вещи:
Для шага 1 мойПрофиль bash автоматически запускает агент ssh, если он еще не запущен, или запрашивает у меня пароль, если срок действия моей личности истек.(См. Код ниже.)
На шаге 2 цель моего ярлыка Windows для запуска emacs выглядит следующим образом:
C:\cygwin\bin\bash.exe --login -c "env HOME=\"`cygpath '%APPDATA%'`\" /cygdrive/c/emacs/emacs-23.1/bin/runemacs.exe"
Аргумент --login
означаетМой bash профиль выполнен, что гарантирует, что шаг 1 всегда выполнялся до запуска emacs.
(Настройка HOME
не требуется для TRAMP, но %APPDATA%
является значением по умолчанию в NT Emacs, и это препятствует тому, чтобы домашний каталог Cygwin имел приоритет, следовательно, сохраняя вашу конфигурацию emacs непротиворечивой, независимо от того, используете ли вы этот ярлык для его запуска.)
Наконец, вот код из моего cygwin .bash_profile, который управляет моим ssh-agent.Это немного глупо, но это работает для меня.
Обратите внимание, что я теряю свою личность через 4 часа (14400 секунд).TRAMP может зависнуть после того, как это произойдет (как упоминалось ранее, я никогда не получал запрос на ввод учетных данных), поэтому следует помнить об этой проблеме.Введите C-g
, чтобы остановить его от попытки подключения.Чтобы возобновить соединение, вы можете просто запустить другую оболочку cygwin, повторно ввести вашу парольную фразу, и тогда TRAMP снова будет счастлив.Время от времени он оставался без ответа, но уничтожение буфера * tramp * все уладит.Если срок действия вашей личности не истек, это, конечно, должно обойти эту проблему.
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