Использование бродяги с EmacsW32 и Cygwin, возможно?
У меня возникли проблемы с настройкой Tramp с EmacsW32 и cygwin. Я настроил Emacs для использования Cygwin в качестве оболочки с помощью w32shell. Я также установил переменную среды HOME в c:/cygwin/home/myusername
Проблема в том, что бродяга, кажется, зависает и что не установлено соединение:
Msgstr "Бродяга ждет подсказок для новой оболочки".
Я попытался включить отладку, но все еще вижу только это сообщение. Будем рады получить несколько советов по этому вопросу. Спасибо.
4 ответа
Обратите внимание на информацию о cygwin в вики emacs: http://www.emacswiki.org/emacs/TrampMode
Я не использую EmacsW32, но я успешно использую TRAMP поверх ssh с Cygwin и NT Emacs.
У меня никогда не было TRAMP, работающего без ssh-агента (т.е. запрашивающего учетные данные) - как вы заметили, он просто зависает - но с ним он работает нормально, поэтому я не тратил время на попытки решить эту проблему. Предполагая, что вы также счастливы использовать агента (и вы уже сгенерировали свои ключи и добавили, если необходимо, файлы authorized_keys), подход, который работает для меня:
- Запустите ssh-agent из cygwin.
- Запустите NT Emacs через cygwin (чтобы он наследовал переменные окружения ssh-agent).
- Используйте sshx в качестве метода TRAMP (вы можете указать его вручную в каждом пути к файлу, но я рекомендую сделать его по умолчанию, с
(setq tramp-default-method "sshx")
).
Все эти моменты описаны в Wiki, но вы также можете несколько автоматизировать:
На шаге 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
Как примечание, с тех пор я изменил способ использования TRAMP под Windows.
TRAMP под Windows был просто слишком медленным. Мне была нужна особенность Control Master в OpenSSH - она поддерживает постоянное соединение SSH открытым, поэтому устраняется дорогостоящее соединение, которое в противном случае требуется для каждой операции TRAMP. К сожалению, Cygwin принципиально не способен поддерживать Control Master на данный момент:/
В этом случае мое текущее решение - совсем не запускать Emacs в Windows. Вместо этого я установил сервер Cygwin X.Org и начал запускать Emacs на виртуальной машине GNU/Linux (размещенной на моем компьютере с Windows) и использовать дисплей Cygwin X.
Это работает действительно очень хорошо.
Я запускаю emacs в режиме демона, что означает, что не имеет значения, возникнут ли какие-либо проблемы с X-сервером, и если мне нужно закрыть окно Windows, я могу просто сохранить состояние ВМ, восстановить его после этого, и на самом деле не потерять мою сессию (*). (desktop.el обеспечивает довольно приличное управление сессиями в любом случае, или если вам нужно перезагрузить виртуальную машину; но если вы используете это, вы можете изменить desktop-files-not-to-save
переменная, чтобы она не игнорировала все ваши буферы TRAMP! Я просто установил это^$
")
Обязательно запустите X-сервер Cygwin с startxwin
скорее, чем startx
(первый позволяет окнам X-сервера появляться как обычные окна Windows), а затем из xterm вы можете выполнить ssh -Y (me)@(linux) -f "emacs --daemon"
изначально запустить сервер, и ssh -Y (me)@(linux) -f "emacsclient -c"
начать новый клиент.
Методы TRAMP 'scpc' и 'rsyncc' автоматически используют Control Master. Тем не менее, я все еще запускаю ssh-agent в Linux (чтобы избежать необходимости аутентификации при открытии удаленных оболочек из emacs и т. Д.). Команда 'emacs --daemon' тогда становится чем-то вроде ssh -Y (me)@(linux) -f "source ~/.ssh/agent-environment && emacs --daemon"
Предполагая, что вы направили / скопировали вывод ssh-agent в этот файл, когда вы его запустили (я не беспокоюсь об истечении времени ожидания для этого).
И, наконец, в этой последней заметке, если вы используете механизм, аналогичный тому, который я первоначально упоминал, для управления вашим ssh-агентом cygwin в вашем bash_profile, внимательно следите за тем, что происходит, когда вы запускаете X-сервер из ярлыка Windows, когда вы не загружена аутентифицированная личность - вообще ничего (пока вы не заглянете в диспетчер задач и не увидите процесс ssh-add, находящийся там). Следовательно, я рекомендую всегда использовать startxwin
из командной строки, чтобы избежать этого.
редактировать:
(*) Это было плохое предположение. С тех пор я понял, что перезапуск X-сервера на самом деле не позволяет мне снова подключиться к демону emacs, что весьма печально. Следовательно, я полностью полагаюсь на настольную библиотеку, чтобы восстановить мою сессию. я использую auto-save-hook
регулярно сохранять файл рабочего стола, чтобы поддерживать его в актуальном состоянии. Посмотрите Emacs Wiki для этой и других опций для улучшения функции рабочего стола.
Раньше я использовал EmacsW32, но у меня было множество подобных проблем. Все они ушли, когда я переключился на Emacs Cygwin. Это, вероятно, уже установлено. Просто введите в приглашении bash следующее:
XWin -multiwindow & экспорт DISPLAY=:0.0 Emacs
Это будет немного легче, чем Linux VM.
В настоящее время Cygwin поставляется с emacs-w32
так что вам не нужно запускать X-сервер.
Я рекомендую начать с:
run emacs-w32
run emacsclient-w32 -a "" %FILE_OR_DIR%
Поскольку это Cygwin Emacs только с родным графическим интерфейсом Windows, он хорошо работает с TRAMP для подключения к хостам Linux.
Вы можете проверить мой скрипт http://hg.defun.work/utils/file/tip/emacs/e.bat как средство быстрого открытия файлов.
ОБНОВЛЕНИЕ С современными Windows и UAC может быть лучше запустить Cygwin Emacs как:
cygstart --action=runas run emacs-w32