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

几天前我开始使用emacs作为我的主编辑器,而且我正在收集所需的所有自定义内容。

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

但作为一个缺点,我发现设置运行emacs的环境还有很长的路要走,而不是直接在开发机器上使用它(并在每台机器上设置环境),我会尽量使用它从我的笔记本电脑,并远程开发。

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

如何用一个emacs击键在远程机器上运行shell命令? 你知道任何其他的提示和技巧,以完成远程开发?

TRAMP支持在远程机器(文件所在的位置)上进行编译和debugging。 这应该是自动和相对无缝的。 查看远程进程的文档。

别担心 您可以用一个按键在Emacs中运行任何东西 。 其他人已经注意到你可以用TRAMP做这个优雅的方法,但是如果这不适合(不pipe什么原因),你也可以用下面的方法来制作自己的函数:

(defun arbitrary-remote-command () (interactive) (shell-command "ssh user@remotehost arbitrary-command")) (global-set-key (kbd "<f5>") 'arbitrary-remote-command) 

在进行远程开发时,我使用的screen提供了多个虚拟远程terminal,可以在几个按键的按下。 这对我来说是不可或缺的。 它不仅提供虚拟terminal,而且如果连接因任何原因而丢失,则会话将保留在服务器上。

有关开始使用screen更多信息,请参阅GNU屏幕生存指南问题。

我通常有一个terminal打开源代码pipe理操作,一个用于编辑,一个用于编译(我只需切换到它,并按UpArrow + Enter),一个用于debugging。 根据我正在处理的环境和应用程序,我可能比这更多或更less,但这是总体布局。

Trey Jackson的回答很好,但Matthew Flaschen的回答实际上帮了我更多。

我找不到一个方法让TRAMP编译,但是不小心我find了命令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连接,我不必input密码。

总结:

  • 编辑远程文件:TRAMP
  • 多个terminal保存状态:SCREEN
  • 定义emacs keybindings来执行远程命令:请参阅Matthew Flaschen的回应
  • 远程编译:使用ControlMaster命令远程编译

我认为这包括一些重要的行动来做远程开发。

我只是ssh进入远程机器,并在terminal模式下运行emacs而不是使用TRAMP。 当你不期望缓慢时,TRAMP真的很慢,至less在我的经验中。 我也看到它以奇怪的方式失败了,如何“修复”它并不总是显而易见的。 如果你使用ssh,你将无法使用emacs UI的东西,比如菜单等等,但是因为你已经习惯了vi,所以对你来说不应该是个问题。 事实上,你可以把它们closures,这样你的ssh emacs体验和你的本地体验非常相似(如果本地!=terminal模式)(1)。

如果您在连接断开的情况下关心保留会话,则使用屏幕可能会很有用 – 除了使用emacs缓冲区获得与虚拟terminal类似的function外。 例如,您可以打开许多shell缓冲区,并在emacs缓冲区中运行各种shell命令。 我用它来运行sqlplus的许多实例(使用重命名缓冲区给他们所有友好的名字)。

既然你已经进入了远程机器,你不必担心运行“远程”shell命令。

另一方面,我不确定你的意思是“我看到设置运行emacs的环境还有很长的路要走”。 如果你有源代码pipe理,这应该是微不足道的(我打赌你有一个很好的理由)。

(1)closures菜单,工具栏和滚动条:

(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))

假设你不想在远程机器上以terminal模式运行emacs,那么这很容易。 如您所知,您可以使用TRAMP编辑远程文件。 我只是把编译命令设置为'ssh me @ remote'cd / path / to / root && make''并完成它。

之前我曾经尝试过TRAMP,但是我也发现它是以奇怪的方式失败的,而且一般都很慢。

我现在使用Emacs编辑通过sshfs挂载的文件。 这对我来说很好。

要安装远程文件系统(假设您已经在.ssh/config正确设置了主机,并且设置了无密码连接的公钥)

 $ sshfs remote:dir localdir 

并从此进行编辑!

至于汇编,请参阅其他答案,他们全面报道。

关于stream氓,它可能取决于你使用的stream氓版本。

个人而言,我使用默认的tramp包和plink作为后端来连接远程主机,所以我将tramp升级到了更新的版本,并解决了很多问题。

其实我在一台Windows机器访问一个Linux(RH5)远程编译和浏览目录,读/写一些文件,在远程机器上编译工作正常。

没有人提到过的一件事是在远程机器上运行emacs,并使用与当前显示对应的有效$ DISPLAYvariables。

很明显,你必须为你的本地显示器运行一个X服务器,但即使在windows上也没什么大问题[使用Cygwin内置的X服务器]。

这通常需要networking延迟<50ms。 如果你ping那个遥控盒并得到大于50ms的东西,你会对这种方法感到沮丧。

在下面,工作很好。

你将需要SSH映射X端口,那里有大量的文档。

自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-〜运行/远程/编译。 它会问你的主机名,然后预填充命令。 两个编译共享相同的历史缓冲区。

这很容易。 它利用了几十年来一直使用的function,而且不需要任何其他的解除工作,而只是通过ssh进行文本处理,所以在长时间或缓慢或拥塞的链接上,它将非常灵敏和高效。 我发现这可以防止networking愤怒的拳头多一点。

两美分:如果带宽不是一个大问题,我会给VNC一个破解。