我在使用 EmacsW32 和 cygwin 设置 Tramp 时遇到了一些麻烦。我已经使用 w32shell 将 emacs 配置为使用 cygwin 作为 shell。我还将 HOME 环境变量设置为 c:/cygwin/home/myusername
问题是流浪汉似乎挂起并且没有建立连接:
“流浪汉等待新外壳的提示”。
我试图打开调试,但仍然只看到这条消息。期待得到这方面的一些提示。谢谢你。
记下 emacs wiki 上与 cygwin 相关的信息: http ://www.emacswiki.org/emacs/TrampMode
我不使用 EmacsW32,但我确实成功地将 TRAMP over ssh 与 Cygwin 和 NT Emacs 一起使用。
我从来没有让 TRAMP 在没有 ssh 代理的情况下工作(即提示输入凭据)——正如你所注意到的,它只是挂起——但它可以正常工作,所以我没有花时间尝试解决这个问题。假设您也很乐意使用代理(并且您已经生成了密钥并根据需要添加了 authorized_keys 文件),适用于我的方法是:
(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。
(HOME
TRAMP 不需要设置,但%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
作为脚注,我已经改变了在 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。
我曾经使用 EmacsW32,但遇到了很多这样的问题。当我切换到 Cygwin 的 Emacs 时,它们都消失了。它可能已经安装了。只需在 bash 提示符下键入以下内容:
XWin - 多窗口 & 导出显示=:0.0 emacs
它会比 Linux VM 轻一点。
现在 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