如何使用Emacs进行远程开发?

37

我几天前开始使用Emacs作为我的主要编辑器,目前正在收集我所需的所有自定义设置。

我主要用它来开发远程Linux机器(RHEL 5)上的C项目。到目前为止,我只是使用普通的vim(仅作为文本编辑器)和一堆shell脚本,有一天我决定尝试一下Emacs。到目前为止,我很喜欢它。

但是,不足之处在于设置环境以运行Emacs还需要花费很长时间,而我想尝试只从我的笔记本电脑使用它并进行远程开发,而不是直接在开发机器上使用它(并在每台使用的机器上设置环境)。

我知道TRAMP,但据我所知它只能编辑远程文件。最大的障碍是用单个按键在远程机器上运行shell命令(我将F5绑定为在远程机器的emacs上运行自定义编译命令)。

如何使用单个Emacs按键在远程机器上运行shell命令? 您是否了解其他全面远程开发的技巧和窍门?


你可以使用带有X11转发的SSH,在远程计算机上运行Emacs,并在你的计算机上显示它。 - Nifle
4
在Emacs 23.2中,当从TRAMP缓冲区运行“compile”命令时,它会自动成为远程编译。 - MarcH
13个回答

24

TRAMP支持在远程机器上(文件所在的机器)进行编译和调试。这应该是自动化且相对无缝的。请查阅远程进程的文档。


TRAMP 在使用 sshfs 挂载远程文件系统时,是否比直接使用 emacs 有更好的性能表现? - alper

20

不用担心。你可以通过一个按键将任何东西在Emacs中运行。其他人已经指出了使用TRAMP可以优雅地完成这个任务,但是如果这种方法不适合(无论出于什么原因),你也可以自己编写一个函数:

(defun arbitrary-remote-command ()
  (interactive)
  (shell-command
   "ssh user@remotehost arbitrary-command"))


(global-set-key (kbd "<f5>") 'arbitrary-remote-command)

10

在进行远程开发时,我使用 screen。它提供了多个虚拟远程终端,只需按下几个键即可使用。这对我来说是不可或缺的。它不仅提供虚拟终端,而且如果连接断开,你的会话也可以保留在服务器上。

有关如何开始使用 screen 的更多信息,请参见GNU Screen Survival Guide

通常,我会打开一个终端用于源代码控制操作,一个用于编辑,一个用于编译(只需切换到它并按 UpArrow+Enter 即可),还有一个用于调试。根据我所工作的环境和应用程序,我可能会使用更多或更少的终端,但这是一般布局。


4
tmux也是一个流行的、积极开发的类似screen的程序。 - Jon W

5

来自Trey Jackson的回答不错,但是Matthew Flaschen的回答实际上更帮助了我。

我找不到让TRAMP编译的方法,但偶然间我发现了命令remote-compile

现在我只需将这些行添加到我的.emacs文件中:

(setq remote-compile-user "root")
(setq remote-compile-host "localhost -p 3000")  ;This is just when tunneling
(setq compile-command " cd /usr/src/nexus/traffic && ./builder.sh compile ; cat builder.log")
(global-set-key (kbd "<f5>") 'remote-compile)

在执行任何操作之前,使用ControlMaster建立ssh连接,这样我就不必输入密码了。

总结:

  • 编辑远程文件:TRAMP
  • 多个终端保存状态:SCREEN
  • 定义emacs按键绑定以执行远程命令:参见Matthew Flaschen的回复
  • 远程编译:使用ControlMaster的remote-compile命令

我认为这涵盖了一些重要的远程开发操作。


您可以使用常规的“编译”命令:当从远程缓冲区运行时,它会自动使用TRAMP(至少在Emacs 23.2中)。我尝试过“remote-compile”,但它失败得很惨:可能是因为它尝试了两次远程。 - MarcH
自 Emacs 24.4 起,“rcompile.el (remote-compile)” 已被弃用。在 Ubuntu 中,“rcompile.el” 可以在目录“/usr/share/emacs/<version>/lisp/obsolete/”中找到。 - Vivek

3

我之前尝试过使用TRAMP处理和你类似的情况,但我也发现它在一些奇怪的方式下出现了问题,并且总体上运行速度较慢。

现在我使用Emacs来编辑通过sshfs挂载的文件,这对我非常有效。

要挂载远程文件系统(假设你已经在.ssh/config中正确设置了主机,并设置了公钥以无需密码连接)

$ sshfs remote:dir localdir

你可以从那时起自由地编辑!

至于编译,可以参考其他答案,它们已经全面地覆盖了这个问题。


2
对我来说,TRAMP存在一个问题,即远程工具链太老旧,而且通常不在我的控制范围之内。因此,我编写了一个包(ppcompile),帮助我在本地开发并远程编译,然后使用next-error的帮助在本地修复编译错误。

2
我建议你直接通过ssh登录到远程机器上,在终端模式下运行emacs,而不是使用TRAMP。在我的经验中,当你不期望的时候,TRAMP会变得非常慢。我也见过它以奇怪的方式失败,而且并不总是很明显该如何“修复”它。如果你通过ssh登录,就无法使用emacs的UI界面,例如菜单等,但既然你习惯于vi,这对你来说应该不是问题。实际上,你可以将它们关闭,这样你的ssh emacs体验就非常类似于本地体验(如果本地!=终端模式)(1)。
使用screen可能会有用,如果你关心在连接断开的情况下保留会话-除此之外,你可以获得与emacs缓冲区相似的虚拟终端功能。例如,你可以打开许多shell缓冲区,并在emacs缓冲区中运行各种shell命令。我使用它来运行许多sqlplus实例(使用rename-buffer为它们都取一个好听、友好的名称)。
由于你已经通过ssh登录到远程机器上,所以不需要担心运行“远程”shell命令。
另一方面,我不确定你所说的“我发现设置环境来运行emacs是一件很麻烦的事情”的意思。如果你有源代码控制,这应该很简单...(我敢打赌你有一个很好的理由)。
(1) 关闭菜单、工具栏和滚动条:
(if (fboundp 'menu-bar-mode) (menu-bar-mode -1))
(if (fboundp 'tool-bar-mode) (tool-bar-mode -1))
(if (fboundp 'scroll-bar-mode) (scroll-bar-mode -1))

我目前的开发方式是这样的,但是例如为了设置w3m以便查看在线文档,我需要安装一堆rpm并解决依赖项,或者编译cedet(没有yum)。其中一部分开发工作包括在最近格式化的系统上测试安装程序,因此每隔一段时间服务器都会被格式化,我需要重新安装emcas。 或者,我需要在另一台服务器上更改一些代码,也需要安装emacs。使用vim没有问题,因为它“开箱即用”(至少作为一个简单的文本编辑器)。 - German

1
关于tramp,它可能取决于您使用的tramp版本。
个人而言,我在使用默认的tramp包和plink作为后端连接到远程主机时遇到了很多问题,所以我升级了tramp到更高版本并解决了许多问题。
实际上,我正在Windows机器上访问Linux(RH5)进行远程编译和浏览目录,读/写一些文件,远程机器上的编译工作正常。

1

假设您不想在远程机器上以终端模式运行emacs,那么这很容易。正如您所知,您可以使用TRAMP编辑远程文件。我只需将compile-command设置为'ssh me@remote "cd /path/to/root && make"',然后就完成了。


0

我自1994年以来一直在使用的:

cat <<-EOF >> ~/.emacs
(define-key global-map "\e`" 'compile)
(define-key global-map "\e~" 'remote-compile)
(require 'compile)
(setq remote-shell-program "ssh")
EOF

现在ESC-`运行编译,ESC-~运行/remote/编译。它会要求您输入主机名,然后预填充命令。两个编译共享同一个历史缓冲区。

这太容易了。它利用了几十年来一直工作的功能,并且不需要任何其他工作即可运行 - 而且它只是通过ssh传输文本,因此在长时间或慢速或拥挤的链接上非常响应和高效。我发现这可以稍微减少网络愤怒的情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接