我试图通过 Tramp 通过 Emacs 打开一个远程文件。
(require 'tramp)
(setq tramp-default-method "ssh")
我收到来自 Emacs 的消息
Tramp:等待来自远程 shell 的提示
Emacs 挂起,之后没有响应任何操作
Emacs 安装在 Windows 上;远程文件位于 Linux 机器上。
如果您要连接的帐户使用一些奇怪的花哨的 shell 提示符,那么很有可能这就是流浪汉旅行的原因。
以root身份登录,然后输入
PS1="> "
(这是一个正常的、标准的 shell(ZSH、BASH、younameit)提示,tramp
会理解的)然后切换到用户帐户,并启动 emacs -q
(以确保您.emacs
没有造成这种混乱)并尝试C-x C-f /sudo:root@localhost:/etc/hosts
查看是什么。
您还可以(不推荐)自定义定义流浪汉期望的正则表达式:
M-x customize-variable RET tramp-terminal-prompt-regexp
我的方法:
tramp-terminal-type
设置为“哑”M-x customize-variable RET tramp-terminal-type
case "$TERM" in "dumb") PS1="> " ;; xterm*|rxvt*|eterm*|screen*) PS1="my fancy multi-line \n prompt > " ;; *) PS1="> " ;; esac
您的 Windows ssh 客户端是这里的关键,而 'ssh' Tramp 方法几乎肯定是错误的。
如果您使用的是 Cygwin,那么您需要使用 'sshx' 方法,并且您可能需要使用 ssh-agent 来处理身份验证。详细信息在这里: 使用 Tramp 与 EmacsW32 和 cygwin,可能吗?
我想这同样适用于任何不需要完整 Cygwin 安装但确实使用 Cygwin DLL 的独立 ssh 客户端。(我提到这一点,因为我很确定我记得看到过这样的事情。)
如果您使用的是 PuTTY,那么您需要“plink”方法,正如 Alex Ott 指出的那样。如果 Wiki 不够用,在此处搜索可能会找到配置该方法的解决方案。
我可以建议的其他选择是:
使用 Cygwin 原生的 Emacs。这将比 NTEmacs 慢,但 Tramp 似乎与 'ssh' 方法配合得很好,而且密码提示也能工作。
在你的 Windows 机器上托管一个 Linux VM,并在其上运行 Emacs。这是一个相当大的障碍,但这是我在 Windows 中工作时使用 Tramp 的首选方式。
嗯,这是流浪汉的缺陷。
.bashrc
真正的解决方案是在使用时防止加载tramp
。(因为现在它是 PS1,但它可以是 PATH,或者你.bashrc
会做的任何其他会让你不快的事情tramp
......)。
这可以通过要求 ssh 设置环境变量并在以下位置进行测试来完成.bashrc
:
将此添加到~/.emacs
:
(require 'tramp-sh nil t)
(setf tramp-ssh-controlmaster-options (concat "-o SendEnv TRAMP=yes " tramp-ssh-controlmaster-options))
并且在开头~/.bashrc
:
if [ ! -z ${TRAMP-x} ] ; then
return
fi
另一个默认设置tramp
是它没有将随机参数传递给ssh
命令的变量,我们必须捎带tramp-ssh-controlmaster-options
.
你检查过Emacs wiki的解决方案吗?ssh
在PATH
?还建议plink
在 MS Windows 上使用 - 请参阅 Tramp 文档中的“内联方法”部分
If the problem is your fancy custom prompt in the remote shell, an easy workaround is to add to your .bashrc
or equivalent:
if [[ $TERM == "dumb" ]]; then
export PS1="$ "
fi
After you define your PS1
.
Note: the credit goes to ChasingLogic as this is their suggestion in this thread.
顺便说一句——如果你需要tramp
——sudo
你实际上可以sudo 而不用流浪汉使用sudoedit
.
目前我正在使用这个 bash 功能:
erf () { SUDO_EDITOR="emacsclient -a emacs" sudoedit $@; }