可以在 EmacsW32 和 cygwin 中使用 tramp 吗?

Posted

技术标签:

【中文标题】可以在 EmacsW32 和 cygwin 中使用 tramp 吗?【英文标题】:Using tramp with EmacsW32 and cygwin, possible? 【发布时间】:2011-02-11 00:21:03 【问题描述】:

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

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

“等待新 shell 的提示”。

我已尝试打开调试,但仍然只看到此消息。期待得到这方面的一些提示。谢谢你。

【问题讨论】:

您是否尝试过 c:\cygwin 用另一种方式使用斜线? 【参考方案1】:

记下 emacs wiki 上与 cygwin 相关的信息: http://www.emacswiki.org/emacs/TrampMode

我不使用 EmacsW32,但我确实成功地将 TRAMP over ssh 与 Cygwin 和 NT Emacs 一起使用。

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

    从 cygwin 运行 ssh-agent。 通过 cygwin 启动 NT Emacs(以便它继承 ssh-agent 环境变量)。 使用 'sshx' 作为 TRAMP 方法(您可以在每个文件路径中手动指定它,但我建议将其设为默认值,使用 (setq tramp-default-method "sshx"))。

这些点都在 Wiki 中进行了介绍,但您也可以在某种程度上实现自动化:

对于第 1 步,如果我的 bash 配置文件尚未运行,我的 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 步。

(TRAMP 不需要设置HOME,但%APPDATA% 是 NT Emacs 下的默认设置,这会阻止 Cygwin 主目录优先,因此无论您是否使用此快捷方式,都可以保持您的 emacs 配置一致运行它。)

最后,这是我的 cygwin .bash_profile 中管理我的 ssh-agent 的代码。这有点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

【讨论】:

要使用 w32 emacs,您可以使用 putty 和它的密钥管理代理 pagent。要连接,请使用“pscp”作为 tramp 方法。一旦你有了这个设置,tramp 就可以顺利运行了。 感谢您的回复。它解决了我使用密钥管理代理的问题。使用 ssh-agent 解决方案,因为我发现使用 putty 进行密钥管理有点麻烦。【参考方案2】:

作为脚注,我已经改变了在 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 执行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。

【讨论】:

另外,假设您希望在 Windows 和 Linux 机器之间共享您的 .emacs,请确保将您的 Win32/Cygwin 集成包装在如下内容中:(when (eq system-type 'windows-nt )(需要'my-win32))【参考方案3】:

我曾经使用 EmacsW32,但是遇到过很多这样的问题。当我切换到 Cygwin 的 Emacs 时,它们都消失了。它可能已经安装了。只需在 bash 提示符下键入以下内容:

XWin - 多窗口 & 导出显示=:0.0 emacs

它会比 Linux 虚拟机轻一些。

【讨论】:

【参考方案4】:

现在 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

【讨论】:

以上是关于可以在 EmacsW32 和 cygwin 中使用 tramp 吗?的主要内容,如果未能解决你的问题,请参考以下文章

你能在64位安装中运行32位Cygwin应用程序吗?

[cross compile]cygwin和mingw

从 cygwin 移植到 win32 本机程序

使用 cygwin 编译器的定制 win32 窗口上的 OpenGL 不起作用

cygwin和mingw的区别

在windows下使用Cygwin模拟unix环境 并安装apt-cyg svn等插件