在EmacsW32和cygwin中使用tramp,可行吗?

8
我在使用EmacsW32和cygwin设置Tramp时遇到了一些问题。我已经配置了emacs使用w32shell将cygwin作为shell,并将HOME环境变量设置为c:/cygwin/home/myusername。
问题是tramp似乎会挂起,没有建立连接:“Tramp waiting for prompts for the new shell”。我尝试打开调试模式,但仍然只看到这个消息。期待得到一些关于此的提示。谢谢。

你尝试过将反斜杠改为正斜杠,使用 c:/cygwin 吗? - Mica
4个回答

7
请注意emacs wiki上关于cygwin的相关信息:http://www.emacswiki.org/emacs/TrampMode 我不使用EmacsW32,但我成功地在Cygwin和NT Emacs上使用TRAMP通过ssh。我从未成功地使用TRAMP而没有ssh代理(即提示凭据),因为你也注意到了它只是挂起状态,但是它与代理一起正常工作,所以我没有花时间去解决这个问题。假设你也愿意使用代理(并且已经生成了您的密钥并根据需要添加了authorized_keys文件),对我有效的方法是:
1.从cygwin运行ssh-agent。 2.通过cygwin启动NT Emacs(以便继承ssh代理环境变量)。 3.使用'sshx'作为TRAMP方法(可以在每个文件路径中手动指定它,但我建议使用(setq tramp-default-method "sshx")将其设置为默认值)。
这些要点都在Wiki中详细说明,但您还可以自动化一些内容:
对于第1步,bash配置文件会自动开始ssh代理(如果尚未运行),或者在我的身份过期时提示我输入密码。 (请参见下面的代码。) 对于第2步,我的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配置一致。)
最后,这是我cygwin .bash_profile中管理ssh-agent的代码。 它有点刻板,但适用于我。 请注意,我将我的身份过期时间设置为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就可以平稳地工作了。 - vedang
感谢您的回复。使用密钥管理代理解决了我的问题。我选择了ssh-agent解决方案,因为我发现在putty中进行密钥管理有点繁琐。 - grm

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缓冲区!我只将其设置为“ ^ $ ”)
请确保使用 startxwin 而不是 startx 启动Cygwin的X服务器(前者使X服务器的窗口显示为常规Windows窗口),然后从xterm中可以执行 ssh -Y(我)@(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(我)@(linux)-f“source ~/.ssh/agent-environment && emacs --daemon”,假设您在运行它时将ssh-agent输出定向/复制到该文件中(对于这个,我不需要身份验证超时)。
最后,在上述最后一个说明中,如果您正在使用与我最初提到的管理cygwin ssh-agent的机制类似的机制来管理bash_profile,请仔细注意当您从Windows快捷方式启动X服务器时会发生什么情况,而没有加载已验证的身份--什么都没有(直到您查看任务管理器,并看到ssh-add进程坐在那里)。因此,我建议始终从命令行使用 startxwin ,以避免这种情况。

编辑:
(*) 那是一个错误的假设。我后来意识到,重新启动X服务器实际上会阻止我之后重新连接到Emacs守护程序,这真是不幸的。因此,我完全依靠桌面库来恢复我的会话。我使用auto-save-hook定期保存我的桌面文件以保持最新状态。请参见Emacs Wiki中有关改进桌面功能的其他选项。


另外,假设您希望在Windows和Linux之间共享您的.emacs,请确保将Win32 / Cygwin集成包装在类似以下内容的东西中:(当(eq system-type'windows-nt)(require'my-win32)) - phils

4

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

XWin -multiwindow &
export DISPLAY=:0.0
emacs

它会比Linux虚拟机更轻便。


0
现在的Cygwin已经自带emacs-w32,所以您不需要启动X服务器。
我建议您这样开始:
run emacs-w32
run emacsclient-w32 -a "" %FILE_OR_DIR%

因为它是带有本地 Windows GUI 的 Cygwin Emacs,所以它可以很好地与 TRAMP 一起使用,用于 ssh 到 Linux 主机。

您可以检查我的脚本 http://hg.defun.work/utils/file/tip/emacs/e.bat 作为快速文件打开器。

更新 随着现代 Windows 和 UAC,最好将 Cygwin Emacs 运行为:

cygstart --action=runas run emacs-w32

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接