使用EmacsW32和cygwin设置Tramp时遇到了一些麻烦。我已经使用w32shell将emacs配置为使用cygwin作为shell。我还将HOME环境变量设置为c:/ cygwin / home / myusername
问题是tramp似乎挂起并且没有建立连接:
“Tramp等待新shell的提示”。
我试图打开调试,但仍然只看到此消息。期待获得一些关于此的提示。谢谢。
答案 0 :(得分:7)
作为一个脚注,我已经改变了在Windows下使用TRAMP的方式。
Windows下的TRAMP太慢了。 OpenSSH的Control Master功能是我所需要的 - 这使得持久的SSH连接保持打开状态,因此消除了每个TRAMP操作所需的昂贵连接。不幸的是,Cygwin在这个时间点根本无法支持Control Master:/在这种情况下,我目前的解决方案是不要在Windows中运行Emacs。相反,我安装了Cygwin的X.Org服务器,并开始在GNU / Linux VM(托管在我的Windows机器上)上运行Emacs,并使用Cygwin X显示器。
这非常有效。
我在守护进程模式下运行emacs,这意味着如果X服务器出现任何问题并不重要,如果我需要关闭Windows框,我可以简单地保存VM的状态,之后恢复它,而不是实际上失去我的会话(*)。 (desktop.el在任何情况下都提供相当不错的会话管理,或者如果您需要重新启动VM;但如果您正在使用它,您可能希望修改desktop-files-not-to-save
变量,以便它不会忽略所有您的TRAMP缓冲区!我只是将其设置为“^$
”)
确保使用startxwin
而不是startx
启动Cygwin的X服务器(前者使X服务器的窗口显示为常规Windows窗口),然后从xterm执行{{1最初启动服务器,ssh -Y (me)@(linux) -f "emacs --daemon"
启动新客户端。
'scpc'和'rsyncc'TRAMP方法自动使用Control Master。我仍然在Linux机器上运行ssh-agent(为了避免在从emacs打开远程shell时需要进行身份验证等)。 'emacs --daemon'命令然后变成类似ssh -Y (me)@(linux) -f "emacsclient -c"
的命令,假设您在运行它时将ssh-agent输出定向/复制到该文件(我不打扰这个文件的身份超时) )。
最后,在最后一个注释中,如果你使用的是与我最初提到的用于在bash_profile中管理cygwin ssh-agent的机制类似的机制,请仔细注意从Windows启动X服务器时会发生什么没有加载经过身份验证的身份时的快捷方式 - 根本没有(直到你查看任务管理器,并看到坐在那里的ssh-add进程)。因此,我建议始终使用命令行中的ssh -Y (me)@(linux) -f "source ~/.ssh/agent-environment && emacs --daemon"
来避免这种情况。
编辑:
(*)这是一个不好的假设。我已经意识到重新启动X服务器实际上确实阻止我之后重新连接到emacs守护进程,这是相当不幸的。因此,我完全依赖桌面库来恢复会话。我使用startxwin
定期保存我的桌面文件以使其保持最新。有关此功能以及其他用于增强桌面功能的选项,请参阅Emacs Wiki。
答案 1 :(得分:5)
记下emacs wiki上与cygwin相关的信息: http://www.emacswiki.org/emacs/TrampMode
我不使用EmacsW32,但是我成功地使用TRAMP而不是使用Cygwin和NT Emacs进行ssh。
如果没有ssh代理(即提示输入凭据),我从未让TRAMP工作 - 正如您所注意到的那样,它只是挂起 - 但它与一个工作正常,所以我没有花时间尝试解决这个问题。假设您也很乐意使用代理(并且您已经生成了密钥并根据需要添加了authorized_keys文件),那么适合我的方法是:
(setq tramp-default-method "sshx")
)。这些要点都包含在Wiki中,但您也可以在某种程度上实现自动化:
对于第1步,我的bash配置文件会自动启动ssh代理(如果尚未运行),或者如果我的身份已过期则提示我输入密码。 (见下面的代码。)
对于第2步,启动emacs的Windows快捷方式的目标如下所示:
C:\cygwin\bin\bash.exe --login -c "env HOME=\"`cygpath '%APPDATA%'`\" /cygdrive/c/emacs/emacs-23.1/bin/runemacs.exe"
--login
参数表示我的bash配置文件已执行,这可确保在启动emacs之前始终处理第1步。
(设置HOME
对于TRAMP不是必需的,但%APPDATA%
是NT Emacs下的默认设置,这可以防止Cygwin主目录优先,因此无论是否保持emacs配置一致您可以使用此快捷方式运行它。)
最后,这是我管理我的ssh-agent的cygwin .bash_profile的代码。这有点hacky,但它对我有用。
请注意我在4小时(14400秒)后使我的身份失效。 TRAMP可以在发生之后挂起(如前所述,我从来没有提示我提供凭证),所以要注意这个问题。输入C-g
以阻止其尝试连接。要恢复连接,通常只需启动另一个cygwin shell,重新输入密码,然后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
答案 2 :(得分:3)
我曾经使用过EmacsW32,但是有很多像这样的问题。当我换到Cygwin的Emacs时,他们全都离开了。它可能已经安装好了。只需在bash提示符下键入以下内容:
XWin -multiwindow & export DISPLAY=:0.0 emacs
它会比Linux VM轻一点。
答案 3 :(得分:0)
现在Cygwin带有emacs-w32
,所以你不需要启动X服务器。
我建议通过以下方式启动它:
run emacs-w32
run emacsclient-w32 -a "" %FILE_OR_DIR%
因为只有原生Windows GUI的Cygwin Emacs,它可以很好地与TRAMP一起用于sshing到Linux主机。
您可以将我的脚本http://hg.defun.work/utils/file/tip/emacs/e.bat检查为快速文件启用器。
更新使用现代Windows和UAC,最好将Cygwin Emacs运行为:
cygstart --action=runas run emacs-w32