Emacs:流浪汉不起作用

Posted

技术标签:

【中文标题】Emacs:流浪汉不起作用【英文标题】:Emacs: Tramp doesn't work 【发布时间】:2011-10-20 17:37:31 【问题描述】:

我试图通过 Tramp 通过 Emacs 打开一个远程文件。

(require 'tramp)
(setq tramp-default-method "ssh")

我从 Emacs 收到一条消息

Tramp:等待来自远程 shell 的提示

Emacs 挂起,之后没有响应任何操作

Emacs 安装在 Windows 上;远程文件在 Linux 机器上。

【问题讨论】:

您在 Windows 机器上使用的是哪个 ssh 客户端? 如果您确实完成了这项工作,请务必发布您的解决方案。作为 Windows 上的长期 Emacs 用户,即使按照各种 wiki 说明进行操作,我也无法让 tramp 可靠地工作。 C-g 确实有助于停止挂起的 Emacs。 【参考方案1】:

如果问题是您在远程 shell 中的自定义提示,一个简单的解决方法是添加到您的 .bashrc 或等效项:

if [[ $TERM == "dumb" ]]; then
    export PS1="$ "
fi

在你定义你的PS1之后。

注意:感谢 ChasingLogic,因为这是他们在 this thread 中的建议。

【讨论】:

现有技术(只是为了完整起见):blog.karssen.org/2016/03/02/… 原始 Emacs Wiki 条目:emacswiki.org/emacs/TrampMode#h5o-9【参考方案2】:

嗯,这是流浪汉的缺陷。

真正的解决方案是防止在使用tramp 时加载.bashrc。 (因为现在它是 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

【讨论】:

我喜欢这里的解释,但这种方法与最受好评的答案中的方法不相似,除了您发送自定义环境变量而不加载 bash(似乎合理)而答案有shell检查TERM环境变量并在Tramp的情况下加载一个简单的提示(也合理)?只是在尝试一种方法之前检查我的理解。【参考方案3】:

如果您要连接的帐户使用了一些奇怪的花哨的 shell 提示符,那么很有可能这就是流浪汉的原因。

以root身份登录,然后输入

PS1="> "

(这是一个普通的、标准的 shell(ZSH、BASH、younameit)提示符,tramp 会理解) 然后切换到用户帐户,启动emacs -q(以确保您的.emacs 不会造成这种混乱)并尝试C-x C-f /sudo:root@localhost:/etc/hosts 看看是什么。

您也可以(不推荐)自定义定义 tramp 期望的正则表达式:

M-x customize-variable RET tramp-terminal-prompt-regexp

我的方法:

    确保变量tramp-terminal-type 设置为“哑”

M-x customize-variable RET tramp-terminal-type

    在您的 .*shrc 中测试它并提供正确的提示:
case "$TERM" in
"dumb")
    PS1="> "
    ;;
xterm*|rxvt*|eterm*|screen*)
    PS1="my fancy multi-line \n prompt > "
    ;;
*)
    PS1="> "
    ;;
esac

【讨论】:

谢谢!这一定是很多人问题的根源,他们只是没有意识到。修复了我认为失败的 Tramp 错误。 值得注意的是,您可以自定义tramp期望的提示(Mx customize-variable "tramp-login-prompt-regexp" 但我的建议是让您的提示tramp兼容(@ 987654321@) 而不是相反 我希望这一切都是自动化的。应为远程主机自动检测提示模式。我们如何实现这一目标? 这对我有用,但使用 C-x C-f /sudo:root@localhost:/etc/hosts 的测试不起作用并返回了关于 sudo can only use the local host 的不同错误(我必须配置多跳或其他东西)。如果您更改了 PS1 变量,我建议直接尝试“我的方法”部分,并将 sudo 配置保存到另一天。 没有人提到我的拦截器:如果 shell 不是交互式的,~/.bashrc 文件会立即返回(默认情况下在 Gentoo 中)。应该删除“return”命令。【参考方案4】:

顺便说一句——如果你需要trampsudo——你实际上可以使用sudoeditsudo without tramp。

目前我正在使用这个 bash 函数:

erf ()  SUDO_EDITOR="emacsclient -a emacs" sudoedit $@; 

【讨论】:

Tramp 的主要用途不是 sudo。 是的——我应该把它作为一个评论,而不是一个答案——但我年轻而愚蠢。 @Adobe 您的名字是软件公司名称。只是说【参考方案5】:

你的 Windows ssh 客户端是这里的关键,'ssh' Tramp 方法几乎肯定是错误的。

如果您使用的是 Cygwin,那么您需要使用 'sshx' 方法,并且您可能需要使用 ssh-agent 来处理身份验证。详情在这里: Using tramp with EmacsW32 and cygwin, possible?

我想这同样适用于任何不需要完整 Cygwin 安装但确实使用 Cygwin DLL 的独立 ssh 客户端。 (我提到这个,因为我很确定我记得看到过这样的事情。)

如果您使用的是 PuTTY,那么您需要“plink”方法,正如 Alex Ott 指出的那样。如果 Wiki 不够用,这里的 search 可能会找到配置该方法的解决方案。

我可以建议的其他选择是:

    使用 Cygwin 原生 Emacs。这会比 NTEmacs 慢,但 Tramp 似乎与 'ssh' 方法配合得很好,而且密码提示也能工作。

    在您的 Windows 机器上托管 Linux VM,并在其上运行 Emacs。这是一个相当大的障碍,但它是my preferred way 在 Windows 中工作时使用 Tramp。

【讨论】:

【参考方案6】:

您检查过Emacs wiki 的解决方案吗? sshPATH 中?还建议在 MS Windows 上使用 plink - 请参阅 Tramp 文档中的“内联方法”部分

【讨论】:

Alex:谢谢,但不幸的是,文档中没有示例。这里是: C-x C-f /plink:user@host:/path/to/file

以上是关于Emacs:流浪汉不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥是 Ctrl+.当我将它绑定到 Emacs 中的命令时不起作用?

文件、编辑、选项等菜单在 Emacs 23 上不起作用,有啥想法吗?

使用 meta-shift 键的快捷方式在 emacs 中不起作用

Emacs,org-mode,evil-mode - TAB键不起作用

add-to-list '加载路径似乎不起作用

虚拟机的 WebPack 和 Vue.js 代理不起作用