几天前我开始使用emacs作为主编,我正在收集所有需要的自定义项。
我给它的主要用途是在远程Linux机器(RHEL 5)上开发C项目。到目前为止,我使用普通的vim(仅作为文本编辑器)和一堆shell脚本,有一天我决定尝试使用emacs。到目前为止,我喜欢它。
但是作为一个缺点,我看到设置运行emacs的环境还有很长的路要走,而不是直接在开发机器上使用它(并在我使用的每台机器上设置环境)我会尝试只需从我的笔记本电脑中使用它并进行远程开发。
我知道TRAMP,但据我所知只编辑远程文件。最大的障碍是通过一次击键在远程机器上运行shell命令(我绑定了F5以在远程机器的emacs上运行自定义编译命令)。
如何使用单个emacs击键在远程计算机上运行shell命令? 你知道其他任何提示吗?完全远程开发的技巧?
答案 0 :(得分:23)
TRAMP支持远程计算机(文件所在的计算机)上的编译和调试。这应该是自动的并且相对无缝。查看remote processes的文档。
答案 1 :(得分:20)
别担心。只需按一下键,您就可以在Emacs中运行任何。其他人已经注意到你可以用TRAMP优雅地做到这一点,但如果这不适合(无论出于何种原因),你也可以使用以下方法烹饪自己的功能:
(defun arbitrary-remote-command ()
(interactive)
(shell-command
"ssh user@remotehost arbitrary-command"))
(global-set-key (kbd "<f5>") 'arbitrary-remote-command)
答案 2 :(得分:10)
在进行远程开发时,我使用screen
,它可以在按下几个键时提供多个虚拟远程终端。这对我来说是不可或缺的。它不仅提供虚拟终端,而且如果您的连接因任何原因而丢失,您的会话也会保留在服务器上。
有关screen
入门的详细信息,请参阅GNU Screen Survival Guide问题。
我通常有一个终端打开源控制操作,一个用于编辑,一个用于编译(我只需要切换到它并点击UpArrow + Enter),一个用于调试。根据我正在处理的环境和应用程序,我可能有更多或更少,但这是一般布局。
答案 3 :(得分: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连接,而不必输入密码。
汇总:
我认为这涵盖了远程开发的一些重要行动。
答案 4 :(得分:2)
我只是ssh到远程机器并在终端模式下运行emacs而不是使用TRAMP。如果你不期望慢,TRAMP真的很慢,至少根据我的经验。我也看到它以奇怪的方式失败,并且如何“修复”它并不总是显而易见的。如果你ssh in,你将无法使用emacs UI的东西,如菜单等,但因为你已经习惯了vi,这对你来说应该不是问题。事实上,您可以关闭它们,以便您的ssh emacs体验与您的本地体验非常相似(如果是本地!=终端模式)(1)。
如果您关心在连接断开时保留会话,使用屏幕可能会很有用 - 除了您获得与具有emacs缓冲区的虚拟终端类似的功能。例如,您可以打开许多shell缓冲区并在emacs缓冲区中运行各种shell命令。我使用它来运行sqlplus的许多实例(使用rename-buffer为它们提供所有漂亮,友好的名称)。
由于您是远程计算机的ssh,因此无需担心运行“远程”shell命令。
另一方面,我不确定你的意思是“我看到设置运行emacs的环境还有很长的路要走”。如果你有源代码控制,这应该是微不足道的......(我敢打赌你有充分的理由)。
(1)关闭菜单,工具栏和滚动条:
(if(fboundp'menu-bar-mode)(menu-bar-mode -1))
(如果(fboundp'工具栏模式)(工具栏模式-1))
(如果(fboundp'滚动条模式)(滚动条模式-1))
答案 5 :(得分:1)
假设您不想在遥控器上以终端模式运行emacs 机器然后它很容易。如您所知,您可以使用TRAMP进行编辑 远程文件。我只是将compile-command设置为'ssh me @ remote“cd / path / to / root&amp;&amp;制作“并完成它。
答案 6 :(得分:1)
我之前尝试过TRAMP来解决像你这样的情况,但我也发现它以奇怪的方式失败,而且总的来说很慢。
我现在正在使用Emacs编辑安装在sshfs mount上的文件。这对我很有用。
安装远程文件系统(假设您在.ssh/config
中正确设置了主机,并设置了公钥,无需密码即可连接)
$ sshfs remote:dir localdir
然后根据自己的喜好进行编辑!
关于编译,请参阅其他答案,他们完整地介绍了这一点。
答案 7 :(得分:1)
关于tramp,它可能取决于你正在使用的tramp版本。
Personnally我用默认的tramp包和plink作为后端连接到远程主机时遇到了很多问题,所以我将tramp升级到更新的版本并解决了很多问题。
实际上我在windows机器上访问linux(RH5)进行远程编译和浏览目录,读/写一些文件,在远程机器上编译工作正常。
答案 8 :(得分:0)
没有人提到的一件事就是在远程机器上运行emacs,并使用与当前显示相对应的有效$ DISPLAY变量。
显然你必须为你的本地显示器运行一个X服务器,但即使在Windows上也不是什么大问题[使用Cygwin内置的X服务器]。
这通常需要网络延迟&lt; 50毫秒。如果你ping那个遥控盒并得到一些东西&gt; 50ms,你会对这种方法感到沮丧。
在此之下,效果很好。
你需要让SSH映射到X端口,那里有很多文档。
答案 9 :(得分: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-运行/远程/编译。它会询问您的主机名,然后预先填充该命令。两个编译共享相同的历史缓冲区。
太容易了。它利用了几十年来一直运行的功能,并且它不需要任何其他提升工作 - 它只是在ssh上的文本,因此它将在长或慢或拥塞的链接上非常敏感和高效。我发现这可以防止网络愤怒的拳头更多。
答案 10 :(得分:0)
对我来说,TRAMP存在一个问题,那就是远程工具链太旧了,并且通常不受我的控制。
因此,我编写了一个程序包(ppcompile)来帮助我进行本地开发和远程编译,然后借助next-error
在本地修复编译错误。
答案 11 :(得分:0)
我有相同的需求:运行Debian 10的Windows虚拟机连接到RHEL7开发机器。这是我的解决方案。
首先,我使用sshfs以保留本地计算机中路径的方式安装远程家:shfs -o allow_other <remote-user-name>@<remote-host>:/home/<remote-host-home> /home/<remote-host-home>
第二,我配置了ssh,这样就不需要一次又一次地输入密码:我可以按照this link中的说明进行操作。
最后,我可以通过M-x编译启动编译,编辑命令并输入类似以下内容:ssh -C <remote-user-name>@<remote-host> "make -C <build-folder>"
它的好处是,当发现编译错误并自动打开源文件时,您可以单击链接。非常方便。
答案 12 :(得分:-2)
两分钱:如果带宽不是一个大问题,我会在VNC上给出一个破解。