syu
2017 年6 月 13 日 03:08
1
问题: 使用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 ?)
2 个赞
syu
2017 年6 月 13 日 03:15
3
OH!! It’s good way. Thanks for sharing.
I would try.
But it has to give changes to the remote before using this function .
Maybe there are any better way for a new host ?
DL-85
2017 年6 月 13 日 03:35
4
sshfs 挂载远程机器 这样就可以在本机端编辑 不知道符不符合要求?
我觉得你需要自动完成。比如 helm。至少可以帮你少按 TAB
链接和问题没什么关系,不过可以用来参考一下它能做什么。
syu
2017 年6 月 13 日 03:43
6
这个办法过于折中,当在大量host需要访问的环境中这个办法不太合适。
不过还是谢谢,这个工具给了我一些在其他方面的启发!
我通常在远程启动一个emacs,run as deamon, server-start
。
然后ssh到远程,用emacsclient -t
启动一个emacs client。
这时候的颜色模式和GUI的比较接近,不知道为什么。
不清楚 Vi,但 Emacs 是可以的,工作流大概向这样:
Terminal.app (或任意的终端模拟器)SSH 登录远程服务器;
登录之后,建立反向隧道 (reverse ssh tunnel)登录本地电脑;
发送命令给本地主机,打开远程文件,如:ssh localhost "emacs /ssh:remotehost:/etc/apache2/"
syu:
同样如果使用 C+f 没办法直接拥有远程路径
C-f 是运行的是什么命令?你的意思是 C-x C-f (find-file
)?
1 个赞
syu
2017 年6 月 13 日 03:58
9
抱歉,我可能没有表述清楚。
我希望将 Emacs 当作terminal使用,但是在这个过程中没有办法快捷编辑某个文件。(可能有的时候只是希望更改某一行代码),所以希望问问大家有没有什么比较好的方式在使用Emacs作为terminal的过程中。
而C-f 是C+x C+f 抱歉 我表达错误。
syu
2017 年6 月 13 日 04:03
10
谢谢你的方法,但是这里存在一个成本:你需要在你所有访问的host安装客户端,那如果是这样的话,我其实直接在远程机器上 emacs xx.file 。我的工作环境通常面临大量的虚拟机,这些虚拟机可能随时销毁,也可能随时创建多个,然而linux也不可能自带emacs。如果每次都去安装,或许有点浪费。
LdBeth
2017 年6 月 13 日 04:16
11
如果你用 eshell,在 ssh 链接以后 输入 find-file XXX 就可以打开远程的文件了。不需要任何额外配置。这个就是所谓的 Tramp。
你可以把这个命令 alias 成 vi 。
如果只编辑一行,就用 sed。awk grep sed 是 Linux 标配,建议你花时间学习一下。。
可以用服务器里编辑器,Emacs 里的 M-x term
虽然不能 100% 达到一般终端模拟器的效果,但好像也能运行 nano、Vim、Emacs 之类的程序。
另外就是用 Tramp 了,缺点就是即使你只想编辑一行,也得要把整个文件先下载下来。至于文件名字补全,你可以先用你的 Shell 把需要编辑的文件写好,然后写一个命令通知 Emacs 直接打开它,可以不用 Tramp 补全,Tramp 好像需要专门开一个 Shell 来补全文件名。
为什么不直接使用终端,独立于emacs.
远程编辑采用Shell 的sed, awk等,或者vim。
1 个赞
刚才在本地试了下,一台笔记本(mac)当作本机,一台台式机(pc)当作服务器,从 mac SSH 到 pc 之后,pc 也可以直接 SSH 到 mac。于是在 pc 中加入这样一条命令:
ec () { ssh mac "emacsclient --no-wait /ssh:pc:$(readlink -f $1)"; }
然后就可以用 ec ~/.bashrc
用 mac 上的 Emacs 打开 pc 上的 ~/.bashrc
了。
一个完整的工作流:
打开 Emacs,开启 Server (M-x server-start
),打开终端 (M-x term
)
~$ ssh pc
Welcome to Ubuntu 17.04 (GNU/Linux 4.10.0-22-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
* Ubuntu 12.04 LTS ('precise') end-of-life was April 28, 2017
ongoing security updates for 12.04 are available with Ubuntu Advantage
- https://ubu.one/U1204esm
* Aaron Honeycutt from the Kubuntu Council on art and design in Kubuntu
- https://ubu.one/kubuart
* The Ubuntu Desktop team wants your feedback on the move to Gnome
- https://ubu.one/2GNome
4 packages can be updated.
0 updates are security updates.
Last login: Tue Jun 13 13:01:21 2017 from 192.168.0.101
xcy@pc:~$ ssh mac 'uname -a'
Darwin Chunyangs-MacBook-Air.local 16.6.0 Darwin Kernel Version 16.6.0: Fri Apr 14 16:21:16 PDT 2017; root:xnu-3789.60.24~6/RELEASE_X86_64 x86_64
xcy@pc:~$ ec () { ssh mac "emacsclient --no-wait /ssh:pc:$(readlink -f $1)"; }
xcy@pc:~$ ec .bashrc
xcy@pc:~$
Emacs 就会自动打开 /ssh:pc:.bashrc
了。
6 个赞
syu
2017 年6 月 13 日 05:40
16
既然使用Emacs, 而Emacs也提供terminal的功能,所以希望看看能不能只用它,虽然我现在也是mac terminal+Emacs 的模式
Emacs 编辑远程体验非常非常非常 不好
楼主说的一遍遍输入完整路径的问题应该是不存在的,例如打开 /ssh [email protected] :~/foo.file
之后,并且当前正在编辑 foo.file
的时候,按 C-x C-f
实际上不需要再次输入 /ssh [email protected] :~/
一大串前缀,只要输入相对路径就可以了。
真正的问题是路径补全很慢,不管是 TAB 还是 helm,都受限制于网速。
另一个问题是保存,不知道有多少人跟我一样,每写两行就习惯性按保存,紧接着执行后续的操作,比如:
|顺序| 按键(evil) |
|----|-------------|---------
| 1 | :w | 保存
| 2 | j | 下一行
| n | ... | ...
如果编辑本地文件,这些动作一气呵成。但是远程文件就不一样了,按下保存键的这一刻,emacs 开始以极低极低极低 的效率上传文件,在结束之前按键是无法响应的。
所以,如果文件大/多的时候,还不如登录到远程去使用编辑器。
远程没有安装编辑器的情况下,我用 Forklift.app
(其它支持 sftp 的 app 应该也行) 登录服务器,找到文件,然后右键 Open With
选择 Emacs,虽然这一部分操作不那么 Emacs,但是之后的编辑就很流畅了。把文件同步的工作交给其它 app,不要难为单线程的 Emacs 。
sshfs
我没试过,不知道它能不能解决 C-x C-f
和文件同步的问题。
1 个赞
syu
2017 年6 月 13 日 06:11
20
关于你说的第一点:我的意思是当你在Emacs的eshell或者term的模式下,ssh到远程服务端,这个时候你如果想要编辑文件使用 C-x C-f 会需要你重新输入username@ip_add:xxx。
至于补全,或者保存问题,确实如果是自己简单搭的环境确实网络响应很慢,常常会被阻塞,就像如果不关闭自动保存,会更不舒服。
或许 Emacs 作为一个仍然有这么大的使用群体的编辑器,需要一次革新。
谢谢你的发言!