并非什么新鲜的功能,Emacs 早就支持了,不存在「跟进」说法。
远程编辑都是这个套路,也就是需要在远程环境安装并启动过一个 server/client,然后 forwading 回本地电脑,类似远程桌面:
看 vscode 给出的快捷 ssh 配置范例 :
Host example-remote-linux-machine-with-identity-file
User your-user-name-on-host
HostName another-host-fqdn-or-ip-goes-here
IdentityFile ~/.ssh/id_rsa-remote-ssh
跟我在 Emacs 的配是一样的:
Host foo
Hostname <remote-ip>
User root
IdentityFile ~/.ssh/foo
ControlMaster auto
ControlPath ~/.ssh/foo.sock
RemoteForward 9999 localhost:9999
远程编辑的最基本的要求 就是: 允许在远程环境安装和运行 clinet / server
对于 Emacs 来说就是在远程安装一份 Emacs,对于 VSCode 来说似乎在远程安装一个单独的 cod-insiders
。
跟远程桌面一样,远程编辑就是把本地的操作(打字,快捷键,命令)发往远程电脑执行。所以,你想要用 LSP 补全,也必须在远程安装相应的 LSP 服务端,想要做静态分析,也必须在远程安装 lint。
如果你的远程环境很古老,远程编辑也救不了你。
相关讨论:
背景:工作中有一些 C/C++ 项目比较古老,编译工具链版本比较低,且有很多专有的库依赖;编译环境相比各种 Linux 发行版,要么工具比较旧,要么没有一些新工具,比如 ag/rg ,且一般我也没有从仓库安装程序的权限。
目前我是在 Windows 中搞了一个 vbox fedora 虚拟机,用来跑 Emacs 写代码,有什么缺少的工具就 dnf install 。
当写完代码之后,再 rsync 同步工程到编译环境,在终端程序中 make 编译。
这时问题来了,如果编译有问题需要来回切换 Emacs 和终端窗口,找到文件、行号再修复,效率低下,体验差。
为改进这里的工作流,利用 compilation mode 应该是一个方向,那么有两种思路:
开发和编译都在编译环境进行
编译环境中工具的不完善,使得无论是(从 vbox ) tramp 还是编译环境直接运行 Emacs 都不太可用,另外多个编译环境维护相同的 Emacs 配置也比较困难。
本地开发,远程编译
维持目前在本地开发的方式不变,只需要维护一个 Emacs 环境比较省心;
只需要优化编译这个环境的工作流即…
问题: 使用emacs 在terminal模式下编辑远程文件的快捷方法
本人使用过 eshell、multi-term、term+、terminal_here几种terminal插件,作为terminal其实几种插件都挺好的。
唯独一个场景中使用效率很低:当用Emacs的terminal登入某个服务器,在操作过程中希望编辑某个文件。这时候你不能直接 vi xx.file 或者 emacs xx.file ,同样如果使用 C+x C+f 没办法直接拥有远程路径,导致你需要再输入一遍 /ssh [email protected] :~/xx.file。
上面我使用过的插件最好的方案也只是在 C+x C+f 的时候用TAB补全,但是一旦连接过大量同网段的host,TAB补全效率也很低。
所以在这里希望问下,大家有没有什么好的解决方案?
(是不是能有什么,快速获取远程路径给 C+x C+f 或者 C+x C+d ?)
网上搜了下,发现大致提到两种方式:
1.emacs client 和 emacs server模式
2.emacs tramp mode
不知是否有人在服务器端进行emacs配置,然后通过ssh连接执行emacs -nw,这样做有什么坏处吗?
采用这种方法,目前发现的问题:复制本地机器上的内容,无法直接粘贴到服务端使用emacs打开的
文件中但可以直接复制到服务端使用vim打开的文件中。
3 个赞
cireu
2019 年5 月 3 日 09:15
4
类似Emacs server和emacs client的区别
其实我觉得可以考虑用网页写一个高颜值的Emacs client
我觉得微软这个不单单是远程编辑,而是编辑编译调试以及运行全套
Emacs 也是一样的,全套功能。
但是要使用全套功能,远程电脑上必须要能安装配套工具。
不太明白, 不知道你说的emacs的这个功能跟VSCode的是否一样.
是远端电脑启动一个emacs daemon, 本地电脑上运行一个emacs GUI? 然后本地emacs GUI可以连接到远端emacs daemon?
接1, 本地emacs GUI操作的所有内容都是远端电脑上的? 比如打开文件, eshell, 运行系统命令?
如果可以实现, 请问哪里有文档?
我平时在本机上经常用emacsclient, 但只用过本地socket模式. 如果让emacsclient通过tcp连接远端emacs server, 那么打开的窗口在哪里?
我刚测试了一下, 编辑窗口出现在远端, 本地emacsclient命令显示:
`Waiting for Emacs…"
通过tramp? 这种方法太low了. 这个跟VSCode的可能不一样. 比如, 我在emacs里运行grep, 搜索的是哪里的文件? 我需要搜索的是远端电脑上的文件.
我觉得这个功能比较好的解决方案是类似nvim的架构, 前端显示和核心数据管理分离. 界面显示和用户输入在本机, 所有的数据和数据操作都在服务器核心模块. 这样才能有稳定和流畅的操作体验, 才能真正实现这个功能.
limon
2019 年5 月 3 日 11:01
11
不,emacs server 就不是设计给远端用的,tcp 模式只是为了应付 windows 没有 socket
这个功能JetBrains的IDE好像早就有了,我之前有同学做机器学习就用PyCharm,就是直接用远程的Python环境。
tramp编辑本地或者内网虚拟机或者容器里的项目勉强能用,远程连接常常卡死,不如ssh上去直接用Vi。
Emacs确实有各种小毛病,比如最近发现eshell不区分stdio/stderr。。
limon
2019 年5 月 3 日 12:14
15
我不太懂windows,看 manual 这么写的。准确的说是 domain socket,不要在意细节。
An Emacs server usually listens to connections on a local Unix domain socket. Some operating systems, such as MS-Windows, do not support local sockets; in that case, the server uses TCP sockets instead.
netjune:
通过tramp? 这种方法太low了.
匆忙找的链接,没认真看,抱歉
limon:
我真的没找到 emacs 这样的实现
我记岔了,跟 X11 forwarding 混为一谈了。我记得是有 ssh -Y remote -f emacsclient ...
这样的用法,但是刚刚这样也连不上,可能跟服务器 iptables 设置有关,不想去改了。
为避免误导,我把前面的回帖有疑议的部分划掉。
https://www.emacswiki.org/emacs/EmacsClient#toc9
tramp会调用remote端的程序,根据default-directory自动识别
在emacs里运行grep, compile, gdb, 这些都什么效果? 远端还是本地? 都可以正常工作吗?
远端,只要支持term=dummy,网络速度没问题,就没问题,本质上是tramp时候的协议,比如ssh
emacsclient 只负责告诉 emacs 打开哪个文件,窗口显示编辑文字全都是用本体负责实现的。
MIT 几十年前的 X forwarding 不就已经解决了这个问题么。程序显示在本地,实际操作都在远程。除了对网络质量要求比较高,Windows 下搞个 VNC 或者 putty 不就完事了,而且不只限于单个程序,只要网够好想上网看视频都行。就算网不好,是跨洋网络,开个 Emacs 和终端模拟器也是绰绰有余的。