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

时间:2010-04-22 10:44:16

标签: emacs cygwin elisp tramp

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

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

“Tramp等待新shell的提示”。

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

4 个答案:

答案 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文件),那么适合我的方法是:

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