8

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

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

“流浪汉等待新外壳的提示”。

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

4

4 回答 4

7

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

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

我从来没有让 TRAMP 在没有 ssh 代理的情况下工作(即提示输入凭据)——正如你所注意到的,它只是挂起——但它可以正常工作,所以我没有花时间尝试解决这个问题。假设您也很乐意使用代理(并且您已经生成了密钥并根据需要添加了 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 配置一致。)

最后,这是我的 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
于 2010-04-23T11:50:20.533 回答
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确保使用而不是启动 Cygwin 的 X 服务器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。

于 2010-06-15T21:59:57.087 回答
4

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

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

它会比 Linux VM 轻一点。

于 2010-12-07T15:39:30.537 回答
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
于 2017-01-23T00:47:08.413 回答