ChatGPT解决这个技术问题 Extra ChatGPT

使用 emacs 和 ssh 打开远程文件的最佳方法是什么

我使用 ssh user@192.168.1.5 连接到远程机器。当我需要在远程机器上打开一个文件时,例如,

emacs /usr/share/nginx/html/index.html

并在 shell 中打开 index.html 文件。我注意到一些 emacs 命令有效,但其他命令无效。例如,C-w 不起作用; M-< 不起作用。我该如何解决这个问题,以及使用 emacs 和 ssh 的最佳方式是什么?

我找到了 this question,但这让我更加困惑。

有哪些有效的命令示例? (有时远程机器上存在不同的键绑定 - 检查远程机器上的 .emacs 文件 - 有时整个键的工作方式不同 - 例如,GNU 屏幕默认吸收 Ctrl-A part of a command 才能进入 emacs。)
C 空间、CF、Cg 工作
我现在在远程机器上找不到 .emacs 文件,但我知道我没有在另一台机器上进行任何新的键绑定
是的,我不确定是什么导致这组键绑定不起作用。 emacs 在远程服务器上打开文件 in the same mode 是否像在本地打开它一样(所有命令都在其中工作)?也许 this 可以提供线索 - M-x describe-mode
你也在本地机器上运行 emacs 吗?您是否有任何理由要使用远程 emacs 与本地 emacs?

C
Carl Groner

我通常更喜欢从本地 Emacs 实例打开远程文件。

在您的本地机器上运行 Emacs 时,通过 ssh 打开远程文件与打开任何其他文件没有太大区别,只是稍微有点 different syntax

对于 ssh,您可以输入 C-x C-f。现在,在 minubuffer 中您要输入 /ssh:user@host:/path/to/file(请注意,一旦您开始输入路径,制表符补全就会起作用。还要注意前导 / 字符)。请参阅完整的 docs here

在您的示例中,这将是:

C-x C-f /ssh:user@192.168.1.5:/usr/share/nginx/html/index.html

现在,您可以在 Emacs 中通过 ssh 编辑远程文件,同时使用本地配置和任何已安装的包等...


OP 可能有兴趣知道此功能称为:tramp,它是您将使用的最有用的东西之一。它甚至可以远程编译!
这很好用,所有命令似乎都可以工作,但我看到它不允许我编辑 index.html,因为它说缓冲区是只读的。但是如果我在远程计算机上打开,我可以编辑同一个文件。顺便说一句,当我用 C-x C-f /ssh:user@host filename 打开文件时,它问我密码。
我尝试了 Documents 目录中的另一个文件,我可以毫无问题地编辑该文件。
你知道如何用这个指定端口吗?
@PhilipKirkbride 完整记录的语法是 /method:user@host#port:filename
a
abo-abo

只是为了添加到上面的答案,您可以为您经常使用的机器编写快捷方式:

(defun connect-remote ()
  (interactive)
  (dired "/user@192.168.1.5:/"))

这将在远程计算机上打开一个 dired 缓冲区。您可以像浏览本地缓冲区一样导航此缓冲区。

如果您已经为远程机器设置了 ssh 密钥,您甚至不必输入密码。

如果你有一堆远程机器,你可以给每个函数起一个可识别的名字,例如connect-cupcakeconnect-kitkat并使用smex包完成。


这很棒。我会试试看。对于我在上面评论中提出的问题,您是否也有答案:如果我在远程机器上打开它,我可以编辑这个文件 /usr/share/nginx/html/index.html;但是当我用 ssh 打开它时,index.html 是只读的。为什么是这样?
我猜您没有与 root 用户连接,通常只有他可以写入 /usr/share/
但是如何以 root 用户身份连接?我尝试了一些类似 C-x C-f /sudo ssh:user@host filename 的方法,但这不起作用。
这是我前段时间试图解决的一个问题,但没有成功。我可以使用 tramp 连接到远程,或以 sudo 连接到本地,但不能同时使用两者。一种解决方法是让您自己成为具有 chown/usr/share/nginx/html/ 文件夹的所有者。
我打开了文件 /etc/nginx/sites-available/example.com.conf 并对其进行了编辑并保存并关闭了它。现在我再次打开它,这一次我不能编辑它?我认为它必须与权限有关。你能帮我理解为什么会这样吗?
D
Drew

并添加到@abo-abo 的关于“快捷方式”的帖子中——

使用 Emacs 书签。 当您访问远程文件或目录时,只需正常创建书签。然后只需使用 C-x r b 跳转到您提供的远程书签(带有完成)。

如果您使用 Bookmark+,那么远程书签会在 *Bookmark List* 中特别突出显示,因此您可以更轻松地识别它们。并且必须由 susudo (root) 访问的远程书签以不同的方式突出显示。

如果您使用 Dired+,那么您还可以快速为多个远程文件或目录添加书签,方法是访问 Dired 中包含它们的远程目录,标记它们,然后点击 C-x b。无需给书签名称;它们以文件命名。即使您从不使用这些书签导航到远程文件,您也可以将它们与 Bookmark+ tags 一起使用来组织文件,从而对它们的子集进行操作。

如果您使用 Icicles,那么每当您使用命令跳转到书签时,您都可以通过在完成期间点击 C-M-@ 将完成候选范围缩小到那些远程的候选对象。


A
Alex

原始发帖人表示有兴趣以 root 用户身份打开远程文件。这可以通过以下命令完成:

C-x C-f /ssh:you@remotehost|sudo:remotehost:/path/to/file RET

可在此处找到更多文档:https://www.emacswiki.org/emacs/TrampMode#toc14


J
JimLohse

一个专注于远程机器的简单答案:

如果我打算在远程机器上完成我所有的 emacs 工作,我使用

ssh -X username@hostname

然后在远程会话中运行 emacs,显示在我的本地机器上。这是一个老问题,但为了完整起见,我想把它扔进去。当然存在一些 xhost / X 配置问题,但在许多网络中,这将立即生效!


D
Drake Sobania

SSH mode for emacs 是您要查找的内容。

设置好后,您只需运行

M-x ssh RET hostname RET

然后它会提示您输入两次密码(一次用于命令行,一次用于加载文件)。

在大多数情况下,您可以像对待任何其他 shell 一样对待它(非交互式和一些小的差异,但仅此而已)。

它会跟踪您所在的目录,因此当您要从正在查看的目录中打开文件时,它会自动从正确的目录开始,您只需输入文件名。

Emacs Wiki 也有更多信息。