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】:
顺便说一句——如果你需要tramp
到sudo
——你实际上可以使用sudoedit
sudo 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 的解决方案吗? ssh
在 PATH
中?还建议在 MS Windows 上使用 plink
- 请参阅 Tramp 文档中的“内联方法”部分
【讨论】:
Alex:谢谢,但不幸的是,文档中没有示例。这里是: C-x C-f /plink:user@host:/path/to/file以上是关于Emacs:流浪汉不起作用的主要内容,如果未能解决你的问题,请参考以下文章
为啥是 Ctrl+.当我将它绑定到 Emacs 中的命令时不起作用?
文件、编辑、选项等菜单在 Emacs 23 上不起作用,有啥想法吗?
使用 meta-shift 键的快捷方式在 emacs 中不起作用