我尝试通过Tramp在Emacs中打开远程文件。
(require 'tramp)
(setq tramp-default-method "ssh")
我从Emacs收到了一条消息
Tramp: 等待来自远程shell的提示
之后Emacs卡住了,没有对任何操作作出响应
Emacs已安装在Windows上; 远程文件位于Linux机器上。
我尝试通过Tramp在Emacs中打开远程文件。
(require 'tramp)
(setq tramp-default-method "ssh")
我从Emacs收到了一条消息
Tramp: 等待来自远程shell的提示
之后Emacs卡住了,没有对任何操作作出响应
Emacs已安装在Windows上; 远程文件位于Linux机器上。
PS1="> "
这是一个普通的、标准的shell(ZSH、BASH等)提示符,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
的值为"dumb"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来处理身份验证。详情请参见: 在EmacsW32和Cygwin中使用Tramp是否可行?
我想同样适用于不需要完整Cygwin安装但使用Cygwin DLL的任何独立SSH客户端。(我提到这一点,因为我相当确定我记得看到这样的东西。)
如果您使用的是PuTTY,则需要使用“plink”方法,正如Alex Ott所指出的那样。如果维基无法满足要求,在这里搜索可能会找到配置此方法的解决方案。
我可以建议的其他替代方案:
使用Cygwin本地Emacs。虽然比NTEmacs慢,但Tramp似乎与“ssh”方法很好地配合使用,并且密码提示也有效。
在Windows机器上托管Linux虚拟机,并在其中运行Emacs。这是一个相当大的障碍,但这是我在Windows中使用Tramp的首选方式。
嗯,这是tramp的一个缺陷。
真正的解决方法是在使用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
。
您是否查看了Emacs维基上的解决方案?ssh
是否在PATH
中?建议在Windows系统上使用plink
-请参阅Tramp文档中的"内联方法"部分。
如果问题出在远程 shell 中的炫酷自定义提示符,一个简单的解决方法是添加以下内容到你的.bashrc
或相应文件中:
if [[ $TERM == "dumb" ]]; then
export PS1="$ "
fi
PS1
之后。tramp
来执行sudo
- 您实际上可以使用sudoedit
无需tramp进行操作。erf () { SUDO_EDITOR="emacsclient -a emacs" sudoedit $@; }