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

如何使用Emacs进行远程开发?,emacs,Emacs,几天前我开始使用emacs作为我的主编辑器,我正在收集我需要的所有定制 我给出的主要用途是在远程Linux机器上开发C项目(RHEL 5)。到目前为止,我使用的是纯vim(仅作为文本编辑器)和一堆shell脚本,有一天我决定尝试emacs。到目前为止我喜欢它 但是,作为一个缺点,我看到设置运行emacs的环境还有很长的路要走,而不是直接在开发机器上使用它(并在我使用的每台机器上设置环境),我会尝试从笔记本电脑上使用它并进行远程开发 我知道TRAMP,但据我所知,它只编辑远程文件。最大的障碍是在远

几天前我开始使用emacs作为我的主编辑器,我正在收集我需要的所有定制

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

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

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

如何在远程机器上通过一次emacs按键运行shell命令?
您知道进行完全远程开发的其他技巧和窍门吗?

在进行远程开发时,我使用它,只需按两个键即可提供多个虚拟远程终端。这对我来说是不可或缺的。它不仅提供虚拟终端,而且如果您的连接因任何原因中断,您的会话将保留在服务器上

有关开始使用
屏幕的更多信息,请参见问题


我通常有一个终端用于源代码管理操作,一个用于编辑,一个用于编译(我只需切换到它并点击向上箭头+回车键),还有一个用于调试。取决于我工作的环境和应用程序,我可能会有更多或更少的文件,但这是总体布局。

TRAMP支持在远程计算机(文件驻留在其上)上编译和调试。这应该是自动的和相对无缝的。查看文档。

别担心。只需一次按键,就可以在Emacs中运行任何东西。其他人已经指出了使用TRAMP可以优雅地实现这一点的方法,但如果这不适合(无论出于何种原因),您也可以使用以下方法来编写自己的函数:

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


(global-set-key (kbd "<f5>") 'arbitrary-remote-command)
(取消任意远程命令()
(互动)
(shell命令
“嘘user@remotehost(任意命令)
(全局设置键(kbd“”)'任意远程命令)

假设您不想在远程计算机上以终端模式运行emacs 那就相当容易了。如您所知,您可以使用TRAMP进行编辑 远程文件。我只是将compile命令设置为“ssh”me@remote“cd
/路径/to/root&&make“”,然后就可以使用它了。

我只需通过ssh连接到远程机器,并在终端模式下运行emacs,而不是使用TRAMP。流浪汉真的很慢,当你不期望慢,至少在我的经验。我也看到它以奇怪的方式失败,而且如何“修复”它并不总是显而易见的。如果您使用ssh,您将无法使用emacs UI内容,如菜单等,但由于您已经习惯使用vi,这对您来说应该不是问题。事实上,您可以关闭它们,这样您的ssh emacs体验与您的本地体验非常相似(如果本地!=终端模式)(1)

如果您关心在连接断开的情况下保留会话,那么使用screen可能会很有用——除此之外,您还可以获得与带有emacs缓冲区的虚拟终端类似的功能。例如,您可以打开许多shell缓冲区,并在emacs缓冲区中运行各种shell命令。我使用它来运行许多sqlplus实例(使用重命名缓冲区来为它们提供友好的名称)

由于您已通过ssh连接到远程计算机,因此无需担心运行“远程”shell命令

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

(1) 关闭菜单、工具栏和滚动条:

(如果(fboundp'菜单栏模式)(菜单栏模式-1))

(如果(fboundp'工具栏模式)(工具栏模式-1))


(如果(fboundp’scroll bar mode)(滚动条模式-1))

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

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

我找不到让TRAMP进行编译的方法,但我意外地找到了命令

现在我只需将以下几行添加到我的.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)
(setq远程编译用户“root”)
(setq远程编译主机“localhost-p3000”);这正是挖掘隧道的时候
(setq编译命令“cd/usr/src/nexus/traffic&&./builder.sh compile;cat builder.log”)
(全局设置键(kbd“”)'远程编译)
在做任何事情之前,使用设置ssh连接,我不必输入密码

总结:

  • 编辑远程文件:TRAMP
  • 多个终端保存状态: 屏风
  • 定义要执行的emacs密钥绑定 远程命令:参见Matthew Flaschen 回应
  • 远程编译:命令 使用ControlMaster进行远程编译

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

对于像您这样的情况,我以前也尝试过TRAMP,但我也发现它以奇怪的方式失败,而且总体上很慢

我现在使用Emacs来编辑在sshfs挂载上挂载的文件。这对我很有效

装载远程文件系统(假设您在
.ssh/config
中正确设置了主机,并设置了公钥以在无密码的情况下进行连接)

从那时起,你可以随心所欲地编辑


至于编译,请参阅其他答案,它们将对此进行全面介绍。

关于tramp,这可能取决于您使用的tramp版本

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

事实上,我在玩windo
$ sshfs remote:dir localdir
cat <<-EOF >> ~/.emacs
(define-key global-map "\e`" 'compile)
(define-key global-map "\e~" 'remote-compile)
(require 'compile)
(setq remote-shell-program "ssh")
EOF