使用tramp与EmacsW32和cygwin,可能吗?

grm*_*grm 8 emacs cygwin elisp tramp

我在使用EmacsW32和cygwin设置Tramp时遇到了一些麻烦.我已经使用w32shell将emacs配置为使用cygwin作为shell.我还将HOME环境变量设置为c:/ cygwin/home/myusername

问题是tramp似乎挂起并且没有建立任何连接:

"Tramp等待新shell的提示".

我试图打开调试,但仍然只看到此消息.期待获得一些关于此的提示.谢谢.

phi*_*ils 7

作为一个脚注,我已经改变了我在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.


phi*_*ils 6

请注意emacs wiki上与cygwin相关的信息:http: //www.emacswiki.org/emacs/TrampMode

我没有使用EmacsW32,但我成功地使用TRAMP而不是使用Cygwin和NT Emacs的ssh.

如果没有ssh代理(即提示输入凭据),我从未让TRAMP工作 - 正如您所注意到的那样,它只是挂起 - 但它可以正常工作,所以我没有花时间尝试解决这个问题.假设您也很乐意使用代理(并且您已经生成了密钥并根据需要添加了authorized_keys文件),那么适用于我的方法是:

  1. 从cygwin运行ssh-agent.
  2. 通过cygwin启动NT Emacs(以便它继承ssh-agent环境变量).
  3. 使用'sshx'作为TRAMP方法(您可以在每个文件路径中手动指定它,但我建议将其设置为默认值(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)