作为一个脚注,我已经改变了我在Windows下使用TRAMP的方式.
Windows下的TRAMP太慢了.OpenSSH的Control Master功能是我所需要的 - 这使得持久的SSH连接保持打开状态,因此消除了每个TRAMP操作所需的昂贵连接.不幸的是,Cygwin在这个时间点根本无法支持Control Master:/
在这种情况下,我目前的解决方案是不要在Windows中运行Emacs.相反,我安装了Cygwin的X.Org服务器,并开始在GNU/Linux VM上运行Emacs(托管在我的Windows机器上),并使用Cygwin X显示器.
这非常有效.
我在守护进程模式下运行emacs,这意味着如果X服务器出现任何问题并不重要,如果我需要关闭Windows框,我可以简单地保存VM的状态,恢复它之后,并没有真正失去我的会话(*).(desktop.el在任何情况下都提供相当不错的会话管理,或者如果您需要重新启动VM;但如果您正在使用它,您可能希望修改desktop-files-not-to-save变量,以便它不会忽略所有TRAMP缓冲区!我把它设置为" ^$")
确保启动Cygwin的X服务器startxwin而不是startx(前者使X服务器的窗口显示为常规Windows窗口),然后从xterm ssh -Y (me)@(linux) -f "emacs --daemon"开始执行以启动服务器,并ssh -Y (me)@(linux) -f "emacsclient -c"启动新客户端.
'scpc'和'rsyncc'TRAMP方法自动使用Control Master.我仍然在Linux机器上运行ssh-agent(为了避免在从emacs打开远程shell时需要进行身份验证等).然后'emacs --daemon'命令变成类似的东西ssh -Y (me)@(linux) -f "source ~/.ssh/agent-environment && emacs --daemon",假设您在运行它时将ssh-agent输出定向/复制到该文件(我不打扰这个文件的标识超时).
最后,在最后一个注释中,如果您使用的是与我最初提到的用于在bash_profile中管理cygwin ssh-agent的机制类似的机制,请仔细注意当您从Windows快捷方式启动X服务器时会发生什么没有加载经过身份验证的身份 - 什么都没有(直到你查看任务管理器,并看到坐在那里的ssh-add进程).因此,我建议始终使用startxwin命令行来避免这种情况.
编辑:
(*)这是一个不好的假设.我已经意识到重新启动X服务器实际上确实阻止了我之后重新连接到emacs守护进程,这是相当不幸的.因此,我完全依赖桌面库来恢复会话.我auto-save-hook用来定期保存我的桌面文件以使其保持最新.有关此功能以及其他用于增强桌面功能的选项,请参阅Emacs Wiki.
请注意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步.
(HOMETRAMP不需要设置,但是%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
Run Code Online (Sandbox Code Playgroud)